<?php
session_start();
include '../../../script/conexion.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit('Método no permitido');
}

if (!hash_equals($_SESSION['csrf'] ?? '', $_POST['csrf'] ?? '')) {
    http_response_code(403);
    exit('Token CSRF inválido');
}

$id_pedido = isset($_POST['id_pedido']) ? (int)$_POST['id_pedido'] : 0;
if ($id_pedido <= 0) {
    http_response_code(400);
    exit('Pedido inválido');
}

$rows = $_POST['rows'] ?? [];
if (!is_array($rows) || empty($rows)) {
    header("Location: ../pedido-detalle.php?id_pedido=$id_pedido");
    exit;
}

$pedido = $conn->query("SELECT * FROM pedido WHERE id='" . (int)$id_pedido . "' LIMIT 1")->fetch_assoc();
if (!$pedido) {
    http_response_code(404);
    exit('Pedido no encontrado');
}

$nombreUsuario = $_SESSION['nombre'] ?? ($_SESSION['usuario'] ?? ($pedido['alm_nombre_usuario'] ?? 'Sistema'));
$fechaPedido   = $pedido['fecha'] ?? date('Y-m-d');

function includeSyncClass(string $file, array $vars = []): void
{
    global $conn;

    $paths = [
        '../../../clases-fabrica/' . $file,
        '../../../clases/' . $file,
    ];

    foreach ($paths as $path) {
        if (file_exists($path)) {
            extract($vars, EXTR_OVERWRITE);
            include $path;
            return;
        }
    }

    throw new Exception('No se encontró la clase de sincronización: ' . $file);
}

$conn->begin_transaction();

try {
    foreach ($rows as $row) {

        $omitido = (int)($row['omitido'] ?? 0);
        if ($omitido === 1) {
            continue;
        }

        $referencia = trim((string)($row['referencia_producto'] ?? ''));
        $talla      = trim((string)($row['talla'] ?? ''));
        $cliente    = trim((string)($row['nombre_tercero'] ?? ''));
        $saldo      = (float)($row['saldo_cliente'] ?? 0);
        $cruce      = (float)($row['cruce_inventario'] ?? 0);
        $extra      = (float)($row['pedido_extra'] ?? 0);

        if ($referencia === '' || $talla === '' || $cliente === '') {
            continue;
        }

        if ($saldo < 0) {
            $saldo = 0;
        }
        if ($cruce < 0) {
            $cruce = 0;
        }
        if ($extra < 0) {
            $extra = 0;
        }
        if ($cruce > $saldo) {
            $cruce = $saldo;
        }

        $pedidoCliente  = max($saldo - $cruce, 0);
        $cruceGuardar   = (int)round($cruce);
        $clienteGuardar = (int)round($pedidoCliente);
        $extraGuardar   = (int)round($extra);

        if ($cruceGuardar <= 0 && $clienteGuardar <= 0 && $extraGuardar <= 0) {
            continue;
        }

        if ($cruceGuardar > 0) {
            $stmt = $conn->prepare("
                INSERT INTO pedido_detalle_origen (
                    id_pedido,
                    id_pedido_detalle,
                    nombre_usuario,
                    fecha,
                    referencia_producto,
                    talla,
                    nombre_tercero,
                    cantidad,
                    tipo_origen,
                    observacion
                ) VALUES (
                    ?, NULL, ?, ?, ?, ?, ?, ?, 'CRUCE_INVENTARIO', ?
                )
            ");

            $obs  = 'Cruce con inventario del almacén';
            $cant = (string)$cruceGuardar;

            $stmt->bind_param(
                'isssssss',
                $id_pedido,
                $nombreUsuario,
                $fechaPedido,
                $referencia,
                $talla,
                $cliente,
                $cant,
                $obs
            );
            $stmt->execute();
            $stmt->close();
        }

        if ($clienteGuardar > 0) {
            $estado = $pedido['estado'];
            $cantPedido = (string)$clienteGuardar;

            $stmt = $conn->prepare("
                INSERT INTO pedido_detalle (
                    id_pedido,
                    referencia_producto,
                    talla,
                    cantidad,
                    estado
                ) VALUES (?, ?, ?, ?, ?)
            ");
            $stmt->bind_param('issss', $id_pedido, $referencia, $talla, $cantPedido, $estado);
            $stmt->execute();
            $idPedidoDetalle = $conn->insert_id;
            $stmt->close();

            $stmt = $conn->prepare("
                INSERT INTO pedido_detalle_origen (
                    id_pedido,
                    id_pedido_detalle,
                    nombre_usuario,
                    fecha,
                    referencia_producto,
                    talla,
                    nombre_tercero,
                    cantidad,
                    tipo_origen,
                    observacion
                ) VALUES (
                    ?, ?, ?, ?, ?, ?, ?, ?, 'PEDIDO_CLIENTE', ?
                )
            ");

            $obs = 'Pendiente del cliente llevado al pedido';

            $stmt->bind_param(
                'iisssssss',
                $id_pedido,
                $idPedidoDetalle,
                $nombreUsuario,
                $fechaPedido,
                $referencia,
                $talla,
                $cliente,
                $cantPedido,
                $obs
            );
            $stmt->execute();
            $stmt->close();

            includeSyncClass('class-referencia.php', [
                'class_referencia' => $referencia,
                'class_talla'      => $talla,
            ]);

            includeSyncClass('class-cierre.php', [
                'class_nombre_tercero_cierre' => $pedido['nombre_tercero'] ?? 'INNOVASUELAS ALMACEN',
                'class_referencia_cierre'     => $referencia,
                'class_talla_cierre'          => $talla,
            ]);
        }

        if ($extraGuardar > 0) {
            $estado = $pedido['estado'];
            $cantExtra = (string)$extraGuardar;

            $stmt = $conn->prepare("
                INSERT INTO pedido_detalle (
                    id_pedido,
                    referencia_producto,
                    talla,
                    cantidad,
                    estado
                ) VALUES (?, ?, ?, ?, ?)
            ");
            $stmt->bind_param('issss', $id_pedido, $referencia, $talla, $cantExtra, $estado);
            $stmt->execute();
            $idPedidoDetalle = $conn->insert_id;
            $stmt->close();

            $stmt = $conn->prepare("
                INSERT INTO pedido_detalle_origen (
                    id_pedido,
                    id_pedido_detalle,
                    nombre_usuario,
                    fecha,
                    referencia_producto,
                    talla,
                    nombre_tercero,
                    cantidad,
                    tipo_origen,
                    observacion
                ) VALUES (
                    ?, ?, ?, ?, ?, ?, NULL, ?, 'PEDIDO_EXTRA', ?
                )
            ");

            $obs = 'Cantidad extra agregada manualmente al pedido';

            $stmt->bind_param(
                'iissssss',
                $id_pedido,
                $idPedidoDetalle,
                $nombreUsuario,
                $fechaPedido,
                $referencia,
                $talla,
                $cantExtra,
                $obs
            );
            $stmt->execute();
            $stmt->close();

            includeSyncClass('class-referencia.php', [
                'class_referencia' => $referencia,
                'class_talla'      => $talla,
            ]);

            includeSyncClass('class-cierre.php', [
                'class_nombre_tercero_cierre' => $pedido['nombre_tercero'] ?? 'INNOVASUELAS ALMACEN',
                'class_referencia_cierre'     => $referencia,
                'class_talla_cierre'          => $talla,
            ]);
        }
    }

    $conn->commit();
    header("Location: ../pedido-detalle.php?id_pedido=$id_pedido&ok_preparado=1");
    exit;
} catch (Throwable $e) {
    $conn->rollback();
    http_response_code(500);
    echo 'Error guardando preparación: ' . $e->getMessage();
}