<?php
if (!defined('BASEPATH')) {
    http_response_code(403);
    die(json_encode(["success" => false, "message" => "Acceso directo no permitido"]));
}

switch ($tipo) {
    case 'getResumenCaja':
        $caja = isset($datapost['caja']) ? mysqli_real_escape_string($conn, $datapost['caja']) : '';
        $sucursal = isset($datapost['sucursal']) ? mysqli_real_escape_string($conn, $datapost['sucursal']) : '';
        $fecha = isset($datapost['fecha']) ? $datapost['fecha'] : date('Y-m-d');

        // Obtener ultimo corte para esta caja
        $sql_ultimo_corte = "SELECT fecha_fin FROM cortes_caja
                            WHERE caja = '$caja' AND sucursal = '$sucursal'
                            ORDER BY fecha_fin DESC LIMIT 1";
        $result_corte = mysqli_query($conn, $sql_ultimo_corte);

        $fecha_inicio = null;
        $es_primer_corte = true;
        if ($result_corte && mysqli_num_rows($result_corte) > 0) {
            $ultimo_corte = mysqli_fetch_assoc($result_corte);
            $fecha_inicio = $ultimo_corte['fecha_fin'];
            $es_primer_corte = false;
        }

        // Resumen de ventas desde el ultimo corte (o todas si es el primer corte)
        $sql_ventas = "SELECT
                        COUNT(*) as num_ventas,
                        COALESCE(SUM(total), 0) as total_ventas,
                        COALESCE(SUM(CASE WHEN metodo_pago = 'efectivo' THEN total ELSE 0 END), 0) as efectivo,
                        COALESCE(SUM(CASE WHEN metodo_pago = 'tarjeta' THEN total ELSE 0 END), 0) as tarjeta
                       FROM ventas
                       WHERE caja = '$caja'
                       AND sucursal = '$sucursal'
                       AND estado = 'completada'";

        // Solo filtrar por fecha si hay un corte previo
        if ($fecha_inicio !== null) {
            $sql_ventas .= " AND fecha >= '$fecha_inicio'";
        }

        $result_ventas = mysqli_query($conn, $sql_ventas);

        if ($result_ventas) {
            $resumen = mysqli_fetch_assoc($result_ventas);

            // Verificar pedidos pausados activos
            $sql_pausados = "SELECT COUNT(*) as total FROM pedidos_pausados
                            WHERE estado = 'activo'
                            AND caja = '$caja'
                            AND sucursal = '$sucursal'";
            $result_pausados = mysqli_query($conn, $sql_pausados);
            $pausados = mysqli_fetch_assoc($result_pausados);

            sendResponse(true, "Resumen obtenido", [
                'fecha_inicio' => $fecha_inicio,
                'fecha_fin' => date('Y-m-d H:i:s'),
                'num_ventas' => (int)$resumen['num_ventas'],
                'total_ventas' => (float)$resumen['total_ventas'],
                'efectivo' => (float)$resumen['efectivo'],
                'tarjeta' => (float)$resumen['tarjeta'],
                'pedidos_pausados' => (int)$pausados['total'],
                'es_primer_corte' => $es_primer_corte
            ]);
        } else {
            sendResponse(false, "Error al obtener resumen: " . mysqli_error($conn));
        }
        break;

    case 'getPedidosPausadosActivos':
        $caja = isset($datapost['caja']) ? mysqli_real_escape_string($conn, $datapost['caja']) : '';
        $sucursal = isset($datapost['sucursal']) ? mysqli_real_escape_string($conn, $datapost['sucursal']) : '';

        $sql = "SELECT pp.*, c.nombre as cliente_nombre
                FROM pedidos_pausados pp
                INNER JOIN clientes c ON pp.cliente_id = c.id
                WHERE pp.estado = 'activo'";

        // Si hay caja/sucursal, filtrar
        if (!empty($caja)) {
            $sql .= " AND pp.caja = '$caja'";
        }
        if (!empty($sucursal)) {
            $sql .= " AND pp.sucursal = '$sucursal'";
        }

        $result = mysqli_query($conn, $sql);

        if ($result) {
            $pedidos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $pedidos[] = [
                    'id' => (int)$row['id'],
                    'cliente_nombre' => $row['cliente_nombre'],
                    'total' => (float)$row['total'],
                    'created_at' => $row['created_at']
                ];
            }
            sendResponse(true, "Pedidos obtenidos", $pedidos);
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'getProductosContabilizar':
        $sql = "SELECT id, nombre, stock, unidad FROM productos
                WHERE activo = 1 AND contabilizar_corte = 1
                ORDER BY nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $productos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $productos[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'stock' => (float)$row['stock'],
                    'unidad' => $row['unidad']
                ];
            }
            sendResponse(true, "Productos obtenidos", $productos);
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'getProductosSalida':
        $sql = "SELECT id, nombre, unidad, COALESCE(tiene_receta, 0) as tiene_receta
                FROM productos
                WHERE activo = 1 AND productos_salida = 1
                ORDER BY nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $productos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $productos[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'unidad' => $row['unidad'],
                    'tiene_receta' => (int)$row['tiene_receta']
                ];
            }
            sendResponse(true, "Productos de salida obtenidos", $productos);
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'realizarCorte':
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : null;
        $caja = isset($datapost['caja']) ? mysqli_real_escape_string($conn, $datapost['caja']) : '';
        $sucursal = isset($datapost['sucursal']) ? mysqli_real_escape_string($conn, $datapost['sucursal']) : '';
        $efectivo_fisico = isset($datapost['efectivo_fisico']) ? (float)$datapost['efectivo_fisico'] : 0;
        $fondo_caja = isset($datapost['fondo_caja']) ? (float)$datapost['fondo_caja'] : 0;
        $detalle_arqueo = isset($datapost['detalle_arqueo']) ? $datapost['detalle_arqueo'] : [];
        $notas = isset($datapost['notas']) ? mysqli_real_escape_string($conn, $datapost['notas']) : '';
        $inventario = isset($datapost['inventario']) ? $datapost['inventario'] : [];
        $salidas = isset($datapost['salidas']) ? $datapost['salidas'] : [];

        // Verificar que no haya pedidos pausados activos
        $sql_pausados = "SELECT COUNT(*) as total FROM pedidos_pausados WHERE estado = 'activo'";
        if (!empty($caja)) {
            $sql_pausados .= " AND caja = '$caja'";
        }
        if (!empty($sucursal)) {
            $sql_pausados .= " AND sucursal = '$sucursal'";
        }
        $result_pausados = mysqli_query($conn, $sql_pausados);
        $pausados = mysqli_fetch_assoc($result_pausados);

        if ((int)$pausados['total'] > 0) {
            sendResponse(false, "No se puede realizar el corte. Hay " . $pausados['total'] . " pedido(s) pausado(s) activo(s).");
        }

        // Obtener fecha del ultimo corte
        $sql_ultimo_corte = "SELECT fecha_fin FROM cortes_caja
                            WHERE caja = '$caja' AND sucursal = '$sucursal'
                            ORDER BY fecha_fin DESC LIMIT 1";
        $result_corte = mysqli_query($conn, $sql_ultimo_corte);

        $fecha_inicio = null;
        if ($result_corte && mysqli_num_rows($result_corte) > 0) {
            $ultimo_corte = mysqli_fetch_assoc($result_corte);
            $fecha_inicio = $ultimo_corte['fecha_fin'];
        }

        // Obtener resumen de ventas (todas si es el primer corte)
        $sql_ventas = "SELECT
                        COUNT(*) as num_ventas,
                        COALESCE(SUM(total), 0) as total_ventas,
                        COALESCE(SUM(CASE WHEN metodo_pago = 'efectivo' THEN total ELSE 0 END), 0) as efectivo,
                        COALESCE(SUM(CASE WHEN metodo_pago = 'tarjeta' THEN total ELSE 0 END), 0) as tarjeta
                       FROM ventas
                       WHERE caja = '$caja'
                       AND sucursal = '$sucursal'
                       AND estado = 'completada'";

        // Solo filtrar por fecha si hay un corte previo
        if ($fecha_inicio !== null) {
            $sql_ventas .= " AND fecha >= '$fecha_inicio'";
        }

        $result_ventas = mysqli_query($conn, $sql_ventas);
        $resumen = mysqli_fetch_assoc($result_ventas);

        // Verificar que haya ventas antes de permitir el corte
        if ((int)$resumen['num_ventas'] === 0) {
            sendResponse(false, "No hay ventas registradas desde el ultimo corte.");
        }

        // Verificar productos a contabilizar
        $sql_productos_cont = "SELECT COUNT(*) as total FROM productos WHERE activo = 1 AND contabilizar_corte = 1";
        $result_prod_cont = mysqli_query($conn, $sql_productos_cont);
        $prod_cont = mysqli_fetch_assoc($result_prod_cont);

        if ((int)$prod_cont['total'] > 0 && empty($inventario)) {
            sendResponse(false, "Debe registrar el inventario de todos los productos antes de realizar el corte.");
        }

        $ventas_efectivo = (float)$resumen['efectivo'];
        $ventas_tarjeta = (float)$resumen['tarjeta'];
        $ventas_total = (float)$resumen['total_ventas'];
        $num_ventas = (int)$resumen['num_ventas'];

        // Si es el primer corte, obtener la fecha de la primera venta
        if ($fecha_inicio === null) {
            $sql_primera_venta = "SELECT MIN(fecha) as primera_fecha FROM ventas
                                  WHERE caja = '$caja' AND sucursal = '$sucursal' AND estado = 'completada'";
            $result_primera = mysqli_query($conn, $sql_primera_venta);
            if ($result_primera && $row_primera = mysqli_fetch_assoc($result_primera)) {
                $fecha_inicio = $row_primera['primera_fecha'] ?? date('Y-m-d H:i:s');
            } else {
                $fecha_inicio = date('Y-m-d H:i:s');
            }
        }

        // Efectivo en sistema = ventas en efectivo + fondo de caja
        $efectivo_sistema = $ventas_efectivo + $fondo_caja;
        $diferencia = $efectivo_fisico - $efectivo_sistema;

        $usuario_val = $usuario_id ? $usuario_id : 'NULL';
        $detalle_json = mysqli_real_escape_string($conn, json_encode($detalle_arqueo));

        $sql = "INSERT INTO cortes_caja
                (usuario_id, sucursal, caja, fecha_inicio, fecha_fin, ventas_efectivo, ventas_tarjeta,
                 ventas_total, num_ventas, efectivo_sistema, efectivo_fisico, diferencia, fondo_caja, detalle_arqueo, notas)
                VALUES
                ($usuario_val, '$sucursal', '$caja', '$fecha_inicio', NOW(), $ventas_efectivo, $ventas_tarjeta,
                 $ventas_total, $num_ventas, $efectivo_sistema, $efectivo_fisico, $diferencia, $fondo_caja, '$detalle_json', '$notas')";

        if (mysqli_query($conn, $sql)) {
            $corte_id = mysqli_insert_id($conn);

            // Guardar historial de inventario y actualizar stock
            $inventario_resultado = [];
            if (!empty($inventario)) {
                foreach ($inventario as $item) {
                    $prod_id = (int)$item['producto_id'];
                    $stock_fisico = (float)$item['stock_fisico'];
                    $prod_nombre = mysqli_real_escape_string($conn, $item['nombre']);
                    $prod_unidad = mysqli_real_escape_string($conn, $item['unidad']);
                    $stock_esperado = (float)$item['stock_esperado'];
                    $diferencia_inv = $stock_fisico - $stock_esperado;

                    // Insertar en historial
                    $sql_hist = "INSERT INTO inventario_cortes (corte_id, producto_id, producto_nombre, stock_esperado, stock_fisico, diferencia, unidad)
                                VALUES ($corte_id, $prod_id, '$prod_nombre', $stock_esperado, $stock_fisico, $diferencia_inv, '$prod_unidad')";
                    mysqli_query($conn, $sql_hist);

                    // Actualizar stock del producto
                    $sql_upd = "UPDATE productos SET stock = $stock_fisico, updated_at = NOW() WHERE id = $prod_id";
                    mysqli_query($conn, $sql_upd);

                    $inventario_resultado[] = [
                        'producto_id' => $prod_id,
                        'nombre' => $prod_nombre,
                        'stock_esperado' => $stock_esperado,
                        'stock_fisico' => $stock_fisico,
                        'diferencia' => $diferencia_inv
                    ];
                }
            }

            // Registrar productos de salida
            $salidas_resultado = [];
            if (!empty($salidas)) {
                foreach ($salidas as $salida) {
                    $prod_id = (int)$salida['producto_id'];
                    $cantidad = (float)$salida['cantidad'];
                    if ($prod_id <= 0 || $cantidad <= 0) continue;

                    $prod_nombre = mysqli_real_escape_string($conn, $salida['nombre']);
                    $prod_unidad = mysqli_real_escape_string($conn, $salida['unidad']);

                    // Verificar si el producto tiene receta
                    $check_receta = mysqli_query($conn, "SELECT COALESCE(tiene_receta, 0) as tr FROM productos WHERE id = $prod_id");
                    $row_receta = $check_receta ? mysqli_fetch_assoc($check_receta) : null;
                    $tiene_receta = $row_receta ? (int)$row_receta['tr'] : 0;

                    // Guardar registro
                    $sql_sal = "INSERT INTO productos_salida_corte (corte_id, producto_id, producto_nombre, cantidad, unidad, tiene_receta)
                                VALUES ($corte_id, $prod_id, '$prod_nombre', $cantidad, '$prod_unidad', $tiene_receta)";
                    mysqli_query($conn, $sql_sal);

                    // Si tiene receta, descontar ingredientes y componentes
                    if ($tiene_receta === 1) {
                        // Descontar ingredientes
                        $sql_ing = "SELECT ingrediente_id, cantidad FROM producto_ingredientes WHERE producto_id = $prod_id";
                        $res_ing = mysqli_query($conn, $sql_ing);
                        if ($res_ing) {
                            while ($row_ing = mysqli_fetch_assoc($res_ing)) {
                                $ing_id = (int)$row_ing['ingrediente_id'];
                                $consumo = (float)$row_ing['cantidad'] * $cantidad;
                                mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad - $consumo WHERE id = $ing_id");
                            }
                        }

                        // Descontar componentes (otros productos)
                        $sql_comp = "SELECT componente_id, cantidad FROM producto_componentes WHERE producto_id = $prod_id";
                        $res_comp = mysqli_query($conn, $sql_comp);
                        if ($res_comp) {
                            while ($row_comp = mysqli_fetch_assoc($res_comp)) {
                                $comp_id = (int)$row_comp['componente_id'];
                                $consumo = (float)$row_comp['cantidad'] * $cantidad;
                                mysqli_query($conn, "UPDATE productos SET stock = stock - $consumo, updated_at = NOW() WHERE id = $comp_id");
                            }
                        }
                    }

                    $salidas_resultado[] = [
                        'producto_id' => $prod_id,
                        'nombre' => $salida['nombre'],
                        'cantidad' => $cantidad,
                        'unidad' => $salida['unidad'],
                        'tiene_receta' => $tiene_receta
                    ];
                }
            }

            // Cerrar turno activo si existe
            $sql_turno = "UPDATE turnos SET estado = 'cerrado', fecha_fin = NOW(), corte_id = $corte_id, updated_at = NOW()
                          WHERE estado = 'activo' AND caja = '$caja' AND sucursal = '$sucursal'";
            mysqli_query($conn, $sql_turno);

            sendResponse(true, "Corte de caja realizado correctamente", [
                'id' => $corte_id,
                'ventas_efectivo' => $ventas_efectivo,
                'ventas_tarjeta' => $ventas_tarjeta,
                'ventas_total' => $ventas_total,
                'num_ventas' => $num_ventas,
                'efectivo_sistema' => $efectivo_sistema,
                'efectivo_fisico' => $efectivo_fisico,
                'diferencia' => $diferencia,
                'inventario' => $inventario_resultado,
                'salidas' => $salidas_resultado
            ]);
        } else {
            sendResponse(false, "Error al realizar corte: " . mysqli_error($conn));
        }
        break;

    case 'getCortes':
        $caja = isset($datapost['caja']) ? mysqli_real_escape_string($conn, $datapost['caja']) : '';
        $sucursal = isset($datapost['sucursal']) ? mysqli_real_escape_string($conn, $datapost['sucursal']) : '';
        $limite = isset($datapost['limite']) ? (int)$datapost['limite'] : 10;

        $sql = "SELECT cc.*, u.nombre as usuario_nombre
                FROM cortes_caja cc
                LEFT JOIN usuarios u ON cc.usuario_id = u.id
                WHERE 1=1";

        if (!empty($caja)) {
            $sql .= " AND cc.caja = '$caja'";
        }
        if (!empty($sucursal)) {
            $sql .= " AND cc.sucursal = '$sucursal'";
        }

        $sql .= " ORDER BY cc.fecha_fin DESC LIMIT $limite";

        $result = mysqli_query($conn, $sql);

        if ($result) {
            $cortes = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $cortes[] = [
                    'id' => (int)$row['id'],
                    'usuario_nombre' => $row['usuario_nombre'],
                    'sucursal' => $row['sucursal'],
                    'caja' => $row['caja'],
                    'fecha_inicio' => $row['fecha_inicio'],
                    'fecha_fin' => $row['fecha_fin'],
                    'ventas_total' => (float)$row['ventas_total'],
                    'ventas_efectivo' => (float)$row['ventas_efectivo'],
                    'ventas_tarjeta' => (float)$row['ventas_tarjeta'],
                    'num_ventas' => (int)$row['num_ventas'],
                    'efectivo_sistema' => (float)$row['efectivo_sistema'],
                    'efectivo_fisico' => (float)$row['efectivo_fisico'],
                    'diferencia' => (float)$row['diferencia'],
                    'fondo_caja' => (float)$row['fondo_caja']
                ];
            }
            sendResponse(true, "Cortes obtenidos", $cortes);
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    default:
        sendResponse(false, "Operacion no valida en Caja");
        break;
}
