<?php
header('Content-Type: application/json; charset=utf-8');
include_once(__DIR__ . '/../db/conexion.php');

$curp = isset($_GET['curp']) ? trim($_GET['curp']) : '';
if (empty($curp)) {
    echo json_encode(['success' => false, 'error' => 'CURP no especificado']);
    exit;
}

// Corregir timezone
if (function_exists('date_default_timezone_set')) {
    date_default_timezone_set('America/Mexico_City');
}

// Depuración: mostrar el CURP recibido
$debug = [];
$debug['curp_recibido'] = $curp;

// Cambiar consulta a VacationsHist y usar diasPendientes
$sql = "SELECT periodo, diasPendientes FROM VacationsHist WHERE CURP = ? ORDER BY fechaInicioLabores DESC";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $curp);
$stmt->execute();
$result = $stmt->get_result();

$vacaciones = [];
$totalPendientes = 0;
while ($row = $result->fetch_assoc()) {
    $vacaciones[] = [
        'periodo' => $row['periodo'],
        'diasPendientes' => (int)$row['diasPendientes']
    ];
    $totalPendientes += (int)$row['diasPendientes'];
}
$debug['vacaciones_count'] = count($vacaciones);
$debug['total_pendientes'] = $totalPendientes;

// 1. Obtener fecha de ingreso
$sqlIngreso = "SELECT `FECHA DE INGRESO` FROM Plantilla WHERE CURP = ? LIMIT 1";
$stmtIngreso = $conn->prepare($sqlIngreso);
$stmtIngreso->bind_param('s', $curp);
$stmtIngreso->execute();
$resIngreso = $stmtIngreso->get_result();
$fechaIngreso = null;
if ($rowIngreso = $resIngreso->fetch_assoc()) {
    $fechaIngreso = $rowIngreso['FECHA DE INGRESO'];
}
$debug['fecha_ingreso'] = $fechaIngreso;

// 2. Calcular aniversarios (periodos)
$periodosEsperados = [];
if ($fechaIngreso) {
    $fechaIni = new DateTime($fechaIngreso);
    $hoy = new DateTime();
    $aniversario = clone $fechaIni;
    $i = 0;
    while ($aniversario <= $hoy) {
        $inicio = clone $aniversario;
        $fin = (clone $inicio)->modify('+1 year -1 day');

        // Solo agregar si el año completo ya fue trabajado (hoy > fin del periodo)
        if ($hoy > $fin) {
            $periodosEsperados[$inicio->format('Y') . '-' . $fin->format('Y')] = $i;
        } else {
            break; // No agregar periodo si todavía no termina
        }

        $aniversario->modify('+1 year');
        $i++;
    }

}
$debug['periodos_esperados'] = array_keys($periodosEsperados);

// Agrupar por periodo y tomar solo el registro con menor diasPendientes
$vacacionesAgrupadas = [];
foreach ($vacaciones as $v) {
    $p = $v['periodo'];
    if (!isset($vacacionesAgrupadas[$p]) || $v['diasPendientes'] < $vacacionesAgrupadas[$p]['diasPendientes']) {
        $vacacionesAgrupadas[$p] = $v;
    }
}
$vacacionesVisual = array_values($vacacionesAgrupadas);

// Si faltan periodos, agregar visualmente el último periodo con días por ley
$periodosEnBD = array_keys($vacacionesAgrupadas);
$periodosEsperadosKeys = array_keys($periodosEsperados);
if (count($periodosEnBD) < count($periodosEsperados) && count($periodosEsperadosKeys) > 0) {
    // Buscar el último periodo esperado
    $ultimoPeriodo = end($periodosEsperadosKeys);
    // Sumar 1 al índice para que el cálculo de años trabajados sea correcto
    $aniosTrabUltimo = $periodosEsperados[$ultimoPeriodo] + 1;
    // Solo agregar si no existe ya en BD
    if (!in_array($ultimoPeriodo, $periodosEnBD)) {
        $vacacionesVisual[] = [
            'periodo' => $ultimoPeriodo,
            'diasPendientes' => diasPorLey($aniosTrabUltimo)
        ];
    }
}

// Calcular total de días pendientes visual
$totalPendientesVisual = array_sum(array_column($vacacionesVisual, 'diasPendientes'));

// Resumen visual
$resumen = [];
foreach ($vacacionesVisual as $v) {
    $resumen[] = "Periodo:{$v['periodo']} Días pendientes:{$v['diasPendientes']}";
}

// 4. Switch para días por ley
function diasPorLey($aniosTrab) {
    switch (true) {
        case ($aniosTrab == 0): return 0;
        case ($aniosTrab == 1): return 12;
        case ($aniosTrab == 2): return 14;
        case ($aniosTrab == 3): return 16;
        case ($aniosTrab == 4): return 18;
        case ($aniosTrab == 5): return 20;
        case ($aniosTrab >= 6 && $aniosTrab <= 10): return 22;
        case ($aniosTrab >= 11 && $aniosTrab <= 15): return 24;
        case ($aniosTrab >= 16 && $aniosTrab <= 20): return 26;
        case ($aniosTrab >= 21 && $aniosTrab <= 25): return 28;
        case ($aniosTrab >= 26 && $aniosTrab <= 30): return 30;
        case ($aniosTrab >= 31): return 32;
        default: return 12;
    }
}

// Validar si el colaborador ha tomado todos sus días de vacaciones
$vacacionesCompletas = false;
$mensajeVacaciones = '';
if (count($periodosEnBD) === count($periodosEsperados) && count($vacacionesVisual) > 0) {
    $ultimoPeriodoVisual = end($vacacionesVisual);
    if ($ultimoPeriodoVisual['diasPendientes'] == 0) {
        $vacacionesCompletas = true;
        $mensajeVacaciones = 'El colaborador ha tomado sus días de vacaciones correspondientes.';
    }
}

$response = [
    'success' => true,
    'vacaciones' => $vacacionesVisual,
    'totalPendientes' => $totalPendientesVisual,
    'resumen' => $resumen,
    'vacacionesCompletas' => $vacacionesCompletas,
    'mensajeVacaciones' => $mensajeVacaciones,
    'debug' => $debug
];

echo json_encode($response, JSON_UNESCAPED_UNICODE);
