<?php
session_start();
header('Content-Type: application/json');

// Verificar método
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['exito' => false, 'mensaje' => 'Método no permitido.']);
    exit();
}

// Recibir datos
$data = json_decode(file_get_contents('php://input'), true);

// Validar
if (empty($data['id_usuario']) || (!isset($data['ferreteria']) && !isset($data['series']))) {
    echo json_encode(['exito' => false, 'mensaje' => 'Datos incompletos o inválidos.']);
    exit();
}

require 'conexion.php'; // conexión mysqli

$id_usuario = $data['id_usuario'];
$ferreteria = $data['ferreteria'] ?? [];
$series = $data['series'] ?? [];

// Obtener id_empresa del usuario
$stmt = $conexion->prepare("SELECT id_empresa FROM usuarios WHERE id = ?");
$stmt->bind_param("i", $id_usuario);
$stmt->execute();
$result = $stmt->get_result();
$user_data = $result->fetch_assoc();

if (!$user_data) {
    echo json_encode(['exito' => false, 'mensaje' => 'Usuario no encontrado.']);
    exit();
}

$id_empresa = $user_data['id_empresa']; // Obtener la id_empresa asociada al usuario
$stmt->close();

// Obtener el último código de devolución generado
$stmt = $conexion->prepare("SELECT MAX(CAST(SUBSTRING(codigo, 5) AS UNSIGNED)) AS ultimo_codigo FROM devoluciones WHERE codigo LIKE 'PFD-%'");
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

// Generar el nuevo código
$ultimo_codigo = $row['ultimo_codigo'] ?? 0; // Si no hay código, comenzamos desde 0
$nuevo_codigo = 'PFD-' . str_pad($ultimo_codigo + 1, 5, '0', STR_PAD_LEFT);

// Iniciar transacción
$conexion->begin_transaction();

try {
    // Insertar cabecera de devolución con id_empresa y código generado
    $stmt = $conexion->prepare("INSERT INTO devoluciones (id_usuario, id_empresa, codigo, fecha) VALUES (?, ?, ?, NOW())");
    $stmt->bind_param("iis", $id_usuario, $id_empresa, $nuevo_codigo); // Insertar id_usuario, id_empresa y el nuevo código
    $stmt->execute();
    $id_devolucion = $conexion->insert_id;
    $stmt->close();

    // Ferretería
    if (!empty($ferreteria)) {
        foreach ($ferreteria as $item) {
            $id_producto = $item['id'];
            $cantidad = $item['cantidad'];

            // Aumentar stock global
            $stmt = $conexion->prepare("UPDATE ferreteria SET stock = stock + ? WHERE id_producto = ?");
            $stmt->bind_param("ii", $cantidad, $id_producto);
            $stmt->execute();
            $stmt->close();

            // Insertar detalle
            $stmt = $conexion->prepare("INSERT INTO detalles_devolucion (id_devolucion, id_producto, cantidad) VALUES (?, ?, ?)");
            $stmt->bind_param("iii", $id_devolucion, $id_producto, $cantidad);
            $stmt->execute();
            $stmt->close();

            // Reducir inventario del técnico
            $stmt = $conexion->prepare("UPDATE inventario_tecnico 
                                        SET cantidad = cantidad - ? 
                                        WHERE id_usuario = ? AND id_producto = ? AND tipo = 'ferreteria'");
            $stmt->bind_param("iii", $cantidad, $id_usuario, $id_producto);
            $stmt->execute();
            $stmt->close();
        }
    }
if (!empty($series)) {
    foreach ($series as $serie) {
        if (!isset($serie['id'])) {
            throw new Exception("Falta el id_serie en los datos de la serie.");
        }

        $id_serie = $serie['id'];
        $comentario = $serie['comentario'] ?? null;

        // Cambiar estado a 'devuelto'
        $stmt = $conexion->prepare("UPDATE series_datos SET estado = 'devuelto' WHERE id_dato = ?");
        $stmt->bind_param("i", $id_serie);
        $stmt->execute();
        $stmt->close();

        // Si el comentario es "doa", guardar en series_baja
        if (strtolower(trim($comentario)) === "doa") {
            // Obtener todos los datos de la serie excepto trabajo_id y trabajo_id_hidden
            $stmt = $conexion->prepare("SELECT * FROM series_datos WHERE id_dato = ?");
            $stmt->bind_param("i", $id_serie);
            $stmt->execute();
            $resultado = $stmt->get_result();
            $datos_serie = $resultado->fetch_assoc();
            $stmt->close();

            if ($datos_serie) {
                // Remover campos no deseados
                unset($datos_serie['id_trabajo'], $datos_serie['trabajo_id_hidden']);

                // Obtener id_usuario e id_empresa de los datos de la serie (si están disponibles)
                $id_usuario = $datos_serie['id_usuario'] ?? null;  // Asegúrate de que id_usuario esté en los datos
                $id_empresa = $datos_serie['id_empresa'] ?? null;  // Asegúrate de que id_empresa esté en los datos
                $serie_nombre = $datos_serie['serie'];  // Suponiendo que el nombre de la serie esté en el campo 'serie'

                // Armar la consulta para insertar en series_baja
                $stmt = $conexion->prepare("INSERT INTO series_baja (id_usuario, id_empresa, serie, fecha, estado, id_dato, id_serie) 
                                            VALUES (?, ?, ?, NOW(), 'llegada', ?, ?)");
                $stmt->bind_param("iissi", $id_usuario, $id_empresa, $serie_nombre, $id_serie, $id_serie);
                $stmt->execute();
                $stmt->close();
            }
        } else {
            // Si NO es DOA, insertar en detalles_devolucion_series normalmente
            $stmt = $conexion->prepare("INSERT INTO detalles_devolucion_series (id_devolucion, id_dato, comentario) VALUES (?, ?, ?)");
            $stmt->bind_param("iis", $id_devolucion, $id_serie, $comentario);
            $stmt->execute();
            $stmt->close();
        }

        // Reducir inventario del técnico (una unidad por serie)
        $stmt = $conexion->prepare("UPDATE inventario_tecnico 
                                    SET cantidad = cantidad - 1 
                                    WHERE id_usuario = ? AND id_dato = ? AND tipo = 'serie'");
        $stmt->bind_param("ii", $id_usuario, $id_serie);
        $stmt->execute();
        $stmt->close();
    }
}


    // Confirmar transacción
    $conexion->commit();

    echo json_encode([
        'exito' => true,
        'mensaje' => 'Devolución procesada correctamente.',
        'id_devolucion' => $id_devolucion,
        'codigo' => $nuevo_codigo // Incluir el código generado en la respuesta
    ]);
} catch (Exception $e) {
    // Rollback en caso de error
    $conexion->rollback();
    echo json_encode([
        'exito' => false,
        'mensaje' => 'Error al procesar la devolución: ' . $e->getMessage()
    ]);
}
?>
