<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

include("conexion.php");
session_start();

// Verificar si la sesión de usuario está activa
if (!isset($_SESSION['id_usuario'])) {
    echo json_encode(['status' => 'error', 'message' => 'Acceso no autorizado.']);
    exit();
}

// Obtención de datos del usuario
$id_usuario = $_SESSION['id_usuario'];
$usuario = $conexion->query("SELECT * FROM usuarios_sistema WHERE id_usuario = $id_usuario")->fetch_assoc();
$id_bodega_usuario = $usuario['id_bodega'];

// Obtener los datos del formulario (productos y series)
$empresa_id = isset($_POST['empresa']) ? $_POST['empresa'] : null;
$usuario_id = isset($_POST['usuario']) ? $_POST['usuario'] : null;
$bodega_id = isset($_POST['bodega']) ? $_POST['bodega'] : null;
$producto_id = isset($_POST['producto']) ? $_POST['producto'] : null;
$cantidad = isset($_POST['cantidad']) ? $_POST['cantidad'] : 0;
$serie_id = isset($_POST['serie']) ? $_POST['serie'] : null;
$carrito_producto_json = isset($_POST['carrito_producto_json']) ? $_POST['carrito_producto_json'] : null;
$carrito_serie_json = isset($_POST['carrito_serie_json']) ? $_POST['carrito_serie_json'] : null;

// Validar que los datos necesarios no estén vacíos
$errores = [];

// Solo verificar cantidad si no se está trabajando solo con series
if (empty($usuario_id)) $errores[] = 'Falta el campo usuario.';
if (empty($bodega_id)) $errores[] = 'Falta el campo bodega.';
if (empty($producto_id) && empty($serie_id)) $errores[] = 'Falta seleccionar un producto o una serie.';

// Si hay errores, devolverlos en el mensaje
if (!empty($errores)) {
    echo json_encode(['status' => 'error', 'message' => 'Faltan datos necesarios.', 'errores' => $errores]);
    exit();
}

// Verificar si el usuario existe en la tabla usuarios_sistema
$query_usuario_existente = "SELECT id FROM usuarios WHERE id = ?";
$stmt_usuario_existente = $conexion->prepare($query_usuario_existente);
$stmt_usuario_existente->bind_param("i", $usuario_id);
$stmt_usuario_existente->execute();
$result_usuario_existente = $stmt_usuario_existente->get_result();

if ($result_usuario_existente->num_rows == 0) {
    echo json_encode(['status' => 'error', 'message' => 'El usuario no existe en la base de datos.']);
    exit();
}

// Procesar productos solo si se ha seleccionado alguno
if (!empty($carrito_producto_json)) {
    $carrito_producto = json_decode($carrito_producto_json, true);
    foreach ($carrito_producto as $producto) {
        $prod_id = isset($producto['id_producto']) ? $producto['id_producto'] : null;
        $prod_cantidad = isset($producto['cantidad']) ? $producto['cantidad'] : 0;

        if ($prod_id && $prod_cantidad > 0) {
            // Verificar si el producto ya existe en inventario_tecnico
            $query_existencia_producto = "SELECT cantidad FROM inventario_tecnico WHERE id_usuario = ? AND id_producto = ?";
            $stmt_existencia_producto = $conexion->prepare($query_existencia_producto);
            $stmt_existencia_producto->bind_param("ii", $usuario_id, $prod_id);
            $stmt_existencia_producto->execute();
            $result_existencia_producto = $stmt_existencia_producto->get_result();

            if ($result_existencia_producto->num_rows > 0) {
                // Si el producto ya existe, actualizar la cantidad
                $row = $result_existencia_producto->fetch_assoc();
                $nueva_cantidad = $row['cantidad'] + $prod_cantidad;
                $query_update_producto = "UPDATE inventario_tecnico SET cantidad = ? WHERE id_usuario = ? AND id_producto = ?";
                $stmt_update_producto = $conexion->prepare($query_update_producto);
                $stmt_update_producto->bind_param("iii", $nueva_cantidad, $usuario_id, $prod_id);
                if (!$stmt_update_producto->execute()) {
                    echo json_encode(['status' => 'error', 'message' => 'Error al actualizar el producto en inventario: ' . $conexion->error]);
                    exit();
                }
                $stmt_update_producto->close();
            } else {
                // Si el producto no existe, insertarlo en el inventario
                $stmt_producto = $conexion->prepare("INSERT INTO inventario_tecnico (id_usuario, tipo, id_producto, cantidad) VALUES (?, 'ferreteria', ?, ?)");
                $stmt_producto->bind_param("iii", $usuario_id, $prod_id, $prod_cantidad);
                if (!$stmt_producto->execute()) {
                    echo json_encode(['status' => 'error', 'message' => 'Error al asignar el producto: ' . $conexion->error]);
                    exit();
                }
                $stmt_producto->close();
            }

            // 🔽 Reducir stock en la tabla ferreteria
            $stmt_reducir_stock = $conexion->prepare("UPDATE ferreteria SET stock = stock - ? WHERE id_producto = ?");
            $stmt_reducir_stock->bind_param("ii", $prod_cantidad, $prod_id);
            if (!$stmt_reducir_stock->execute()) {
                echo json_encode(['status' => 'error', 'message' => 'Error al reducir el stock: ' . $conexion->error]);
                exit();
            }
            $stmt_reducir_stock->close();
        }
    }
}

// Procesar series solo si se ha seleccionado alguna
if (!empty($carrito_serie_json)) {
    $carrito_serie = json_decode($carrito_serie_json, true);
    foreach ($carrito_serie as $serie) {
        $serie_id = isset($serie['id_serie']) ? $serie['id_serie'] : null;
        $serie_nombre = isset($serie['serie']) ? $serie['serie'] : null;

        if ($serie_id && $serie_nombre) {
            // Verificar si la serie ya existe en inventario_tecnico
            $query_existencia_serie = "SELECT cantidad FROM inventario_tecnico WHERE id_usuario = ? AND id_dato = ? AND tipo = 'serie'";
            $stmt_existencia_serie = $conexion->prepare($query_existencia_serie);
            $stmt_existencia_serie->bind_param("ii", $usuario_id, $serie_id);
            $stmt_existencia_serie->execute();
            $result_existencia_serie = $stmt_existencia_serie->get_result();

            if ($result_existencia_serie->num_rows > 0) {
                // Si la serie ya existe, actualizar la cantidad
                $row = $result_existencia_serie->fetch_assoc();
                $nueva_cantidad_serie = $row['cantidad'] + 1;  // Solo incrementamos en 1
                $query_update_serie = "UPDATE inventario_tecnico SET cantidad = ? WHERE id_usuario = ? AND id_dato = ? AND tipo = 'serie'";
                $stmt_update_serie = $conexion->prepare($query_update_serie);
                $stmt_update_serie->bind_param("iii", $nueva_cantidad_serie, $usuario_id, $serie_id);
                if (!$stmt_update_serie->execute()) {
                    echo json_encode(['status' => 'error', 'message' => 'Error al actualizar la serie en inventario: ' . $conexion->error]);
                    exit();
                }
                $stmt_update_serie->close();
            } else {
                // Si la serie no existe, insertarla en el inventario
                $stmt_serie = $conexion->prepare("INSERT INTO inventario_tecnico (id_usuario, tipo, id_dato, cantidad) VALUES (?, 'serie', ?, 1)");
                $stmt_serie->bind_param("ii", $usuario_id, $serie_id);

                if (!$stmt_serie->execute()) {
                    echo json_encode(['status' => 'error', 'message' => 'Error al asignar la serie: ' . $conexion->error]);
                    exit();
                }
                $stmt_serie->close();
            }

            // Actualizar el estado de la serie a 'usado'
            $stmt_actualizar_serie = $conexion->prepare("UPDATE series_datos SET estado = 'usado' WHERE id_dato = ?");
            $stmt_actualizar_serie->bind_param("i", $serie_id);

            if (!$stmt_actualizar_serie->execute()) {
                echo json_encode(['status' => 'error', 'message' => 'Error al actualizar el estado de la serie: ' . $conexion->error]);
                exit();
            }
            $stmt_actualizar_serie->close();
        }
    }
}

// Respuesta exitosa
echo json_encode(['status' => 'success', 'message' => 'Asignación realizada con éxito.']);
exit();
?>
