<?php
// ? Errores (quitar en producción)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// ? CORS y Headers
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// ? Conexión
require_once(__DIR__ . '/../config.php');
 $mysqli->set_charset("utf8mb4");

// ? JSON
 $input = json_decode(file_get_contents('php://input'), true);
if (!$input) { 
    echo json_encode(['success'=>false,'message'=>'JSON inválido']); 
    exit; 
}

// --- VALIDACIÓN DE PARÁMETROS ---
 $slug_tienda = isset($input['slug_tienda']) ? trim($input['slug_tienda']) : '';
if ($slug_tienda === '') {
    echo json_encode(['success'=>false,'message'=>'El slug de la tienda es requerido.']);
    exit;
}

// --- CONSTRUCCIÓN DINÁMICA DE LA CONSULTA ---

// 1. Parámetros de filtro (con valores por defecto)
 $estados = isset($input['estados']) && is_array($input['estados']) ? $input['estados'] : ['pagada', 'pendiente'];
 $fecha_inicio = isset($input['fechaInicio']) ? trim($input['fechaInicio']) : null;
 $fecha_fin = isset($input['fechaFin']) ? trim($input['fechaFin']) : null;

// 2. Base de la consulta SQL
 $sql = "
    SELECT 
        id, 
        numero_factura, 
        fecha, 
        cajero, 
        cliente_nombre, 
        cliente_documento, 
        total, 
        estado
    FROM facturas
    WHERE slug_tienda = ?
";

// 3. Array para guardar los parámetros y tipos para bind_param
 $params = [$slug_tienda];
 $types = 's'; // 's' por el slug_tienda

// 4. Añadir filtros dinámicamente a la consulta y a los parámetros
if (!empty($estados)) {
    // Crear placeholders (?, ?, ...) para la cláusula IN
    $placeholders = implode(',', array_fill(0, count($estados), '?'));
    $sql .= " AND estado IN ($placeholders)";
    // Añadir cada estado al array de parámetros
    foreach ($estados as $estado) {
        $params[] = $estado;
        $types .= 's'; // Cada estado es un string
    }
}

if (!empty($fecha_inicio)) {
    $sql .= " AND DATE(fecha) >= ?";
    $params[] = $fecha_inicio;
    $types .= 's';
}

if (!empty($fecha_fin)) {
    $sql .= " AND DATE(fecha) <= ?";
    $params[] = $fecha_fin;
    $types .= 's';
}

// 5. Añadir ordenamiento
 $sql .= " ORDER BY fecha DESC";

try {
    $stmt = $mysqli->prepare($sql);
    
    if (!$stmt) {
        throw new Exception("Error al preparar la consulta: " . $mysqli->error);
    }

    // El operador '...' (splat) desempaqueta el array $params en argumentos para bind_param
    if (!empty($params)) {
        $stmt->bind_param($types, ...$params);
    }
    
    if (!$stmt->execute()) {
        throw new Exception("Error al ejecutar la consulta: " . $stmt->error);
    }
    
    $result = $stmt->get_result();
    $facturas = $result->fetch_all(MYSQLI_ASSOC);
    $stmt->close();
    
    echo json_encode(['success' => true, 'facturas' => $facturas]);
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success'=>false,'message'=>$e->getMessage()]);
} finally {
    if (isset($mysqli) && $mysqli) { $mysqli->close(); }
}
?>