<?php
/**
 * CierreCaja - Consultar datos consolidados por mes/año
 * Agrupa facturas por fecha + sucursal y retorna los totales
 */

header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/db.php';

// Mapeo fijo de sucursales (mismo orden siempre)
const SUCURSALES = [
    1 => 'TERMINAL',
    2 => 'CENTRO',
    3 => 'SANFE',
    4 => 'SECTOR 8',
];

$mesParam = isset($_GET['mes']) ? $_GET['mes'] : '';
$anioParam = isset($_GET['anio']) ? $_GET['anio'] : '';

$todosMeses = ($mesParam === 'todos' || $mesParam === '');
$todosAnios = ($anioParam === 'todos' || $anioParam === '');

$mes = 0;
$anio = 0;

if (!$todosMeses) {
    $mes = (int)$mesParam;
    if ($mes < 1 || $mes > 12) {
        echo json_encode(['success' => false, 'error' => 'Mes inválido']);
        exit;
    }
}

if (!$todosAnios) {
    $anio = (int)$anioParam;
    if ($anio < 2020 || $anio > 2100) {
        echo json_encode(['success' => false, 'error' => 'Año inválido']);
        exit;
    }
}

$pdo = getConnection();

// Construir WHERE cláusula dinámicamente
$where = [];
$params = [];

if (!$todosMeses) {
    $where[] = "MONTH(fecha_emision) = ?";
    $params[] = $mes;
}
if (!$todosAnios) {
    $where[] = "YEAR(fecha_emision) = ?";
    $params[] = $anio;
}

$whereSql = "";
if (count($where) > 0) {
    $whereSql = "WHERE " . implode(" AND ", $where);
}

// 1. Obtener meses distintos que tienen datos en este rango
$sqlMonths = "
    SELECT DISTINCT YEAR(fecha_emision) AS anio, MONTH(fecha_emision) AS mes
    FROM cierre_caja_facturas
    $whereSql
    ORDER BY anio ASC, mes ASC
";
$stmtMonths = $pdo->prepare($sqlMonths);
$stmtMonths->execute($params);
$activeMonths = $stmtMonths->fetchAll();

// Si no hay datos en absoluto
if (empty($activeMonths)) {
    // Si era una consulta de mes específico, podemos simular ese mes para mostrar la tabla vacía
    if (!$todosMeses && !$todosAnios) {
        $activeMonths = [['anio' => $anio, 'mes' => $mes]];
    } else {
        // Retornar éxito pero con datos vacíos
        $mesesNombres = [
            1 => 'enero', 2 => 'febrero', 3 => 'marzo', 4 => 'abril',
            5 => 'mayo', 6 => 'junio', 7 => 'julio', 8 => 'agosto',
            9 => 'septiembre', 10 => 'octubre', 11 => 'noviembre', 12 => 'diciembre',
        ];
        
        $titulo = "Cierre de Caja";
        if ($todosMeses && $todosAnios) {
            $titulo .= " - Todos los Periodos";
        } elseif ($todosMeses) {
            $titulo .= " - Año " . $anio;
        } elseif ($todosAnios) {
            $titulo .= " - " . ucfirst($mesesNombres[$mes] ?? '') . " (Todos los Años)";
        } else {
            $titulo .= " - " . ucfirst($mesesNombres[$mes] ?? '') . " " . $anio;
        }

        echo json_encode([
            'success' => true,
            'mes' => $todosMeses ? 'todos' : $mes,
            'anio' => $todosAnios ? 'todos' : $anio,
            'mes_nombre' => $todosMeses ? 'todos' : ($mesesNombres[$mes] ?? ''),
            'titulo' => $titulo,
            'datos' => [],
            'resumen_meses' => [],
            'estadisticas' => [
                'total_facturas' => 0,
                'total_mes' => 0.00,
                'dias_con_datos' => 0,
                'dias_en_mes' => 0,
            ],
        ]);
        exit;
    }
}

$todasLasFechas = [];
foreach ($activeMonths as $mRow) {
    $y = (int)$mRow['anio'];
    $m = (int)$mRow['mes'];
    $diasEnMes = (int) date('t', mktime(0, 0, 0, $m, 1, $y));
    for ($d = 1; $d <= $diasEnMes; $d++) {
        $todasLasFechas[] = [
            'fecha' => sprintf('%04d-%02d-%02d', $y, $m, $d),
            'anio' => $y,
            'mes' => $m
        ];
    }
}

// Obtener subtotales
$sqlData = "
    SELECT 
        fecha_emision,
        codigo_establecimiento,
        SUM(gran_total) AS subtotal,
        COUNT(*) AS num_facturas
    FROM cierre_caja_facturas
    $whereSql
    GROUP BY fecha_emision, codigo_establecimiento
    ORDER BY fecha_emision ASC, codigo_establecimiento ASC
";
$stmtData = $pdo->prepare($sqlData);
$stmtData->execute($params);
$rows = $stmtData->fetchAll();

// Indexar datos por fecha + código
$dataMap = [];
foreach ($rows as $row) {
    $fecha = $row['fecha_emision'];
    $codigo = (int) $row['codigo_establecimiento'];
    
    if (!isset($dataMap[$fecha])) {
        $dataMap[$fecha] = [];
    }
    $dataMap[$fecha][$codigo] = [
        'subtotal' => (float) $row['subtotal'],
        'num_facturas' => (int) $row['num_facturas'],
    ];
}

// Construir resultado
$resultado = [];
$diasConDatosPorMes = []; // "anio-mes" => count

foreach ($todasLasFechas as $fInfo) {
    $fecha = $fInfo['fecha'];
    $y = $fInfo['anio'];
    $m = $fInfo['mes'];
    $key = "$y-$m";

    $totalDia = 0;
    $filasDia = [];

    foreach (SUCURSALES as $codigo => $nombre) {
        $subtotal = $dataMap[$fecha][$codigo]['subtotal'] ?? 0;
        $numFacturas = $dataMap[$fecha][$codigo]['num_facturas'] ?? 0;
        $totalDia += $subtotal;

        $filasDia[] = [
            'fecha' => $fecha,
            'codigo_establecimiento' => $codigo,
            'sucursal' => $nombre,
            'subtotal' => round($subtotal, 2),
            'num_facturas' => $numFacturas,
        ];
    }

    // Agregar el total del día a la primera fila del grupo
    $filasDia[0]['total_facturado'] = round($totalDia, 2);

    if ($totalDia > 0) {
        $diasConDatosPorMes[$key] = ($diasConDatosPorMes[$key] ?? 0) + 1;
    }

    $resultado = array_merge($resultado, $filasDia);
}

// Estadísticas globales y por mes
$sqlStats = "
    SELECT 
        YEAR(fecha_emision) AS anio,
        MONTH(fecha_emision) AS mes,
        COUNT(*) AS total_facturas,
        COALESCE(SUM(gran_total), 0) AS total_mes
    FROM cierre_caja_facturas
    $whereSql
    GROUP BY YEAR(fecha_emision), MONTH(fecha_emision)
    ORDER BY anio ASC, mes ASC
";
$stmtStats = $pdo->prepare($sqlStats);
$stmtStats->execute($params);
$statsRows = $stmtStats->fetchAll();

$mesesNombres = [
    1 => 'enero', 2 => 'febrero', 3 => 'marzo', 4 => 'abril',
    5 => 'mayo', 6 => 'junio', 7 => 'julio', 8 => 'agosto',
    9 => 'septiembre', 10 => 'octubre', 11 => 'noviembre', 12 => 'diciembre',
];

$resumenMeses = [];
$globalFacturas = 0;
$globalTotal = 0;
$globalDiasConDatos = 0;
$globalDiasEnMes = 0;

foreach ($statsRows as $sRow) {
    $y = (int)$sRow['anio'];
    $m = (int)$sRow['mes'];
    $key = "$y-$m";
    $tf = (int)$sRow['total_facturas'];
    $tm = (float)$sRow['total_mes'];
    
    $diasConDatos = $diasConDatosPorMes[$key] ?? 0;
    $diasEnMes = (int) date('t', mktime(0, 0, 0, $m, 1, $y));
    
    $globalFacturas += $tf;
    $globalTotal += $tm;
    $globalDiasConDatos += $diasConDatos;
    $globalDiasEnMes += $diasEnMes;

    $resumenMeses[] = [
        'mes' => $m,
        'anio' => $y,
        'mes_nombre' => $mesesNombres[$m] ?? '',
        'total_facturas' => $tf,
        'total_mes' => round($tm, 2),
        'dias_con_datos' => $diasConDatos,
        'dias_en_mes' => $diasEnMes,
    ];
}

// Si la consulta fue para un mes simulado
if (empty($resumenMeses) && !$todosMeses && !$todosAnios) {
    $globalDiasEnMes = (int) date('t', mktime(0, 0, 0, $mes, 1, $anio));
}

$titulo = "Cierre de Caja";
if ($todosMeses && $todosAnios) {
    $titulo .= " - Todos los Periodos";
} elseif ($todosMeses) {
    $titulo .= " - Año " . $anio;
} elseif ($todosAnios) {
    $titulo .= " - " . ucfirst($mesesNombres[$mes] ?? '') . " (Todos los Años)";
} else {
    $titulo .= " - " . ucfirst($mesesNombres[$mes] ?? '') . " " . $anio;
}

echo json_encode([
    'success' => true,
    'mes' => $todosMeses ? 'todos' : $mes,
    'anio' => $todosAnios ? 'todos' : $anio,
    'mes_nombre' => $todosMeses ? 'todos' : ($mesesNombres[$mes] ?? ''),
    'titulo' => $titulo,
    'datos' => $resultado,
    'resumen_meses' => $resumenMeses,
    'estadisticas' => [
        'total_facturas' => $globalFacturas,
        'total_mes' => round($globalTotal, 2),
        'dias_con_datos' => $globalDiasConDatos,
        'dias_en_mes' => $globalDiasEnMes,
    ],
]);
