<?php
/**
 * API: Obtener Ventas del Día con Filtros
 * OPTIMIZADO: Consultas SQL eficientes con rangos de fecha
 */

header('Content-Type: application/json');
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");

require_once '../../db_connection.php';

try {
    // Configurar zona horaria de Guatemala
    // Zona horaria ya configurada en db_connection.php
    
    // Obtener sucursal activa
    $config = require '../../config/sucursal_activa.php';
    $idSucursal = $config['sucursal_id'];
    
    // Obtener filtro
    $filter = isset($_GET['filter']) ? $_GET['filter'] : 'todas';
    
    // OPTIMIZACIÓN: Usar rango de fechas en lugar de DATE() para aprovechar índices
    $hoyInicio = date('Y-m-d') . ' 00:00:00';
    $hoyFin = date('Y-m-d') . ' 23:59:59';
    
    $ventas = [];
    
    // Query para ventas normales (solo si aplica el filtro)
    if ($filter !== 'especiales') {
        $sql = "SELECT 
                    v.id,
                    v.fecha_y_hora,
                    v.total,
                    dv.id as detalle_id,
                    dv.producto_id,
                    dv.cantidad,
                    dv.precio as precio_unitario,
                    dv.subtotal,
                    dv.facturado,
                    dv.estado_factura,
                    p.NombreComercial,
                    p.CodigoInterno,
                    p.CodigoBarra,
                    p.laboratorio
                FROM ventas v
                INNER JOIN detalle_ventas dv ON v.id = dv.venta_id
                INNER JOIN productos p ON dv.producto_id = p.id
                WHERE v.sucursal_id = :sucursal
                AND v.fecha_y_hora BETWEEN :inicio AND :fin";
        
        // Aplicar filtro de facturación
        if ($filter === 'facturadas' || $filter === 'reimpresion') {
            $sql .= " AND dv.facturado = 1 AND dv.estado_factura = 'FACTURADO'";
        } elseif ($filter === 'no_facturadas') {
            $sql .= " AND dv.facturado = 1 AND dv.estado_factura = 'PENDIENTE'";
        }
        
        $sql .= " ORDER BY v.id DESC, dv.id ASC";
        
        $stmt = $pdo->prepare($sql);
        $stmt->bindValue(':sucursal', $idSucursal, PDO::PARAM_INT);
        $stmt->bindValue(':inicio', $hoyInicio, PDO::PARAM_STR);
        $stmt->bindValue(':fin', $hoyFin, PDO::PARAM_STR);
        $stmt->execute();
        
        // Agrupar por venta de forma eficiente
        $currentVentaId = null;
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $vid = $row['id'];
            
            if ($vid !== $currentVentaId) {
                $currentVentaId = $vid;
                $ventas[$vid] = [
                    'id' => (int)$vid,
                    'fecha_y_hora' => $row['fecha_y_hora'],
                    'total' => (float)$row['total'],
                    'tipo' => 'Normal',
                    'items' => []
                ];
            }

            // Determinar nombre de la unidad
            $unidadLabel = 'Unid.';
            
            $ventas[$vid]['items'][] = [
                'producto' => $row['NombreComercial'],
                'codigo_interno' => $row['CodigoInterno'],
                'codigo_barra' => $row['CodigoBarra'],
                'laboratorio' => $row['laboratorio'],
                'cantidad' => (float)$row['cantidad'],
                'unidad' => $unidadLabel,
                'precio_unitario' => (float)$row['precio_unitario'],
                'subtotal' => (float)$row['subtotal'],
                'facturado' => (bool)$row['facturado'],
                'estado_factura' => $row['estado_factura']
            ];
        }
    }
    
    // Query para ventas especiales (solo si aplica)
    if ($filter === 'todas' || $filter === 'especiales') {
        $sqlEsp = "SELECT id, fecha_y_hora, descripcion, precio
                   FROM ventas_especiales
                   WHERE sucursal_id = :sucursal
                   AND fecha_y_hora BETWEEN :inicio AND :fin
                   ORDER BY id DESC";
        
        $stmtEsp = $pdo->prepare($sqlEsp);
        $stmtEsp->bindValue(':sucursal', $idSucursal, PDO::PARAM_INT);
        $stmtEsp->bindValue(':inicio', $hoyInicio, PDO::PARAM_STR);
        $stmtEsp->bindValue(':fin', $hoyFin, PDO::PARAM_STR);
        $stmtEsp->execute();
        
        while ($row = $stmtEsp->fetch(PDO::FETCH_ASSOC)) {
            $ventas['e_' . $row['id']] = [
                'id' => 'E-' . $row['id'],
                'fecha_y_hora' => $row['fecha_y_hora'],
                'total' => (float)$row['precio'],
                'tipo' => 'Especial',
                'items' => [[
                    'producto' => $row['descripcion'],
                    'codigo_interno' => 'N/A',
                    'codigo_barra' => 'N/A',
                    'laboratorio' => 'N/A',
                    'cantidad' => 1,
                    'unidad' => 'Servicio',
                    'precio_unitario' => (float)$row['precio'],
                    'subtotal' => (float)$row['precio'],
                    'facturado' => false,
                    'estado_factura' => 'Especial'
                ]]
            ];
        }
    }
    
    // Ordenar por fecha descendente y convertir a array
    $ventasArray = array_values($ventas);
    usort($ventasArray, fn($a, $b) => strtotime($b['fecha_y_hora']) - strtotime($a['fecha_y_hora']));
    
    echo json_encode([
        'success' => true,
        'ventas' => $ventasArray,
        'filter' => $filter,
        'total_ventas' => count($ventasArray)
    ], JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Error al obtener ventas: ' . $e->getMessage()
    ]);
}
