<?php
session_start();
require_once(__DIR__ . '/../../backend/db/conexion.php');

// Verifica CURPs
if (empty($_POST['curps'])) {
    die('No se recibieron registros para exportar.');
}
$curps = json_decode($_POST['curps'], true);
if (!$curps || !is_array($curps)) {
    die('Formato de datos incorrecto.');
}

// PhpSpreadsheet
require_once __DIR__ . '/../../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

// Encabezados
$headers = [
    'DEPARTAMENTO INTERNO',
    'CENTRO DE COSTOS',
    'SUELDO MENSUAL REAL',
    'FECHA DE INGRESO',
    'APELLIDOS',
    'NOMBRES',
    'RFC',
    'CURP',
    'NSS',
    'Codigo Fiscal',
    'FECHA DE BAJA',
    'DIAS DE VACACIONES DISPONIBLES',
    'DIAS LABORADOS', // Nueva columna
    'PAGO DIAS LABORADOS', // Nueva columna
    'TIPO FINIQUITO',
    'DESCRIPCIÓN TIPO FINIQUITO'
];

// Función: días por ley según antigüedad
function calcularDiasVacacionesLey($fechaIngresoStr) {
    if (empty($fechaIngresoStr) || $fechaIngresoStr === '0000-00-00') return 0;
    $fechaIngreso = DateTime::createFromFormat('Y-m-d', $fechaIngresoStr);
    $fechaActual = new DateTime();
    $aniosTrab = $fechaActual->diff($fechaIngreso)->y;

    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;
    }
}

// Función: obtiene días de vacaciones disponibles
function obtenerDiasVacacionesDisponibles($conn, $curp, $fechaIngreso, $fechaBaja = null) {
    if (empty($fechaIngreso) || $fechaIngreso === '0000-00-00') return 'Sin fecha de ingreso';

    $fechaIngresoObj = DateTime::createFromFormat('Y-m-d', $fechaIngreso);
    $fechaActual = $fechaBaja && $fechaBaja !== '0000-00-00' ? DateTime::createFromFormat('Y-m-d', $fechaBaja) : new DateTime();
    $diff = $fechaActual->diff($fechaIngresoObj);
    $anios = $diff->y;
    $meses = $diff->y * 12 + $diff->m;

    $anioIngreso = (int)$fechaIngresoObj->format('Y');
    $periodos = [];
    for ($i = 0; $i < $anios; $i++) {
        $periodos[] = ($anioIngreso + $i) . "-" . ($anioIngreso + $i + 1);
    }

    $totalDias = 0;

    // Buscar historial con días pendientes
    $stmt = $conn->prepare("SELECT periodo, diasPendientes, fechaInicioLabores FROM VacationsHist WHERE CURP = ? ORDER BY fechaInicioLabores DESC");
    $stmt->bind_param("s", $curp);
    $stmt->execute();
    $res = $stmt->get_result();

    $historial = [];
    $ultimoPeriodoPendiente = null;

    while ($row = $res->fetch_assoc()) {
        $periodo = $row['periodo'];
        $dias = (int)$row['diasPendientes'];
        if (!isset($historial[$periodo])) {
            $historial[$periodo] = $dias;
        } else {
            $historial[$periodo] = min($historial[$periodo], $dias);
        }
        if ($dias > 0 && !$ultimoPeriodoPendiente) {
            $ultimoPeriodoPendiente = $periodo;
        }
    }

    if (count($historial) > 0 && $ultimoPeriodoPendiente) {
        $totalDias = array_sum($historial);
        $idxUltimoPeriodo = array_search($ultimoPeriodoPendiente, $periodos);
        if ($idxUltimoPeriodo !== false && $idxUltimoPeriodo != count($periodos) - 1 && count($periodos) > 1) {
            $totalDias += calcularDiasVacacionesLey($fechaIngreso);
        }
    } else {
        // No hay historial o todo en 0
        $stmt2 = $conn->prepare("SELECT MAX(ID) AS id FROM VacationsHist WHERE CURP = ? AND diasPendientes = 0");
        $stmt2->bind_param("s", $curp);
        $stmt2->execute();
        $res2 = $stmt2->get_result();
        $idMax = $res2->fetch_assoc()['id'] ?? null;

        if ($idMax) {
            $stmt3 = $conn->prepare("SELECT periodo FROM VacationsHist WHERE ID = ?");
            $stmt3->bind_param("i", $idMax);
            $stmt3->execute();
            $res3 = $stmt3->get_result();
            $ultimoPeriodoCero = $res3->fetch_assoc()['periodo'] ?? null;
            if (array_search($ultimoPeriodoCero, $periodos) === count($periodos) - 1) {
                $totalDias = 0;
            } else {
                $totalDias = calcularDiasVacacionesLey($fechaIngreso);
            }
        } else {
            $totalDias = calcularDiasVacacionesLey($fechaIngreso);
        }
    }
    // Si el resultado es 0 o vacío, mostrar leyenda especial
    if (empty($totalDias) || $totalDias == 0) {
        return 'Días proporcionales al primer año';
    }
    // Siempre agregar leyenda de días proporcionales si hay días
    return $totalDias . ' + días proporcionales';
}

// Consulta plantilla
function obtenerDatosPlantilla($conn, $curp) {
    $sql = "SELECT 
        p.`DEPARTAMENTO INTERNO`,
        IFNULL(c.centro_de_costos, 'Por definir') AS `CENTRO DE COSTOS`,
        p.`SUELDO MENSUAL` AS `SUELDO MENSUAL REAL`,
        p.`FECHA REINGRESO`,
        p.`FECHA DE INGRESO`,
        CONCAT(p.`APELLIDO PATERNO`, ' ', p.`APELLIDO MATERNO`) AS APELLIDOS,
        p.NOMBRES,
        p.RFC,
        p.CURP,
        p.NSS,
        p.CPdeRFC AS `Codigo Fiscal`,
        p.`Fecha Baja` AS `FECHA DE BAJA`,
        p.`FECHA BAJA DEFINITIVA`,
        b.tipoFiniquito,
        b.diasLaborados,
        b.pagoDiasLaborados
    FROM Plantilla p
    LEFT JOIN centros_costos c ON p.`DEPARTAMENTO INTERNO` = c.punto_de_venta
    LEFT JOIN Bajas b ON p.CURP = b.CURP
    WHERE p.CURP = ?
    LIMIT 1";

    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $curp);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    // Obtener Folio_idse_baja y Fecha_baja_idse desde Plantilla_datos_financieros
    $row['Folio_idse_baja'] = '';
    $row['Fecha_baja_idse'] = '';
    $sqlExtra = "SELECT Folio_idse_baja, Fecha_baja_idse FROM Plantilla_datos_financieros WHERE CURP = ? LIMIT 1";
    $stmt2 = $conn->prepare($sqlExtra);
    $stmt2->bind_param("s", $curp);
    if ($stmt2->execute()) {
        $res2 = $stmt2->get_result();
        if ($extra = $res2->fetch_assoc()) {
            $row['Folio_idse_baja'] = $extra['Folio_idse_baja'] ?? '';
            $row['Fecha_baja_idse'] = $extra['Fecha_baja_idse'] ?? '';
        }
    }
    return $row;
}

// Crear Excel
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->fromArray($headers, null, 'A1');

// Estilos
$headerStyles = [
    'A1:C1' => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FF9999']]],
    'D1:E1' => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => '7ED47E']]],
    'F1:I1' => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'A3BCE7']]],
    'J1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FFF7A3']]],
    'K1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'C9E2F5']]],
    'L1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FFD966']]], // Amarillo para L
    'M1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FFD966']]], // Amarillo para M
    'N1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FFD966']]], // Amarillo para N
    'O1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FFD966']]], // Amarillo para O
    'P1'    => ['font' => ['bold' => true], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'FFD966']]], // Amarillo para P
];
foreach ($headerStyles as $range => $style) {
    $sheet->getStyle($range)->applyFromArray($style);
}

// Llenar datos
$rowNum = 2;
foreach ($curps as $curp) {
    $fila = obtenerDatosPlantilla($conn, $curp);
    if ($fila) {
        $fechaIngreso = $fila['FECHA REINGRESO'] && $fila['FECHA REINGRESO'] !== '0000-00-00' ? $fila['FECHA REINGRESO'] : $fila['FECHA DE INGRESO'];
        $fecha_baja = (!empty($fila['FECHA REINGRESO']) && $fila['FECHA REINGRESO'] !== '0000-00-00') ?
                    $fila['FECHA BAJA DEFINITIVA'] : $fila['FECHA DE BAJA'];
        $diasVac = obtenerDiasVacacionesDisponibles($conn, $curp, $fechaIngreso, $fecha_baja);
        $sueldo = is_numeric($fila['SUELDO MENSUAL REAL']) ? '$' . number_format($fila['SUELDO MENSUAL REAL'], 2, '.', ',') : '';
        $tipoFiniquito = $fila['tipoFiniquito'] ?? '';
        // Descripción según tipo finiquito
        $descFiniquito = '';
        switch ($tipoFiniquito) {
            case 'Ausentismo':
                $descFiniquito = '*Se timbra finiquito 15 días posterior a la fecha baja; retorna a contabilidad al día 16';
                break;
            case 'Directo':
                $descFiniquito = '*Se timbra el finiquito hasta en 5 días; 10 días después retorna a contabilidad';
                break;
            case 'Despido Futuro':
                $descFiniquito = '*Se timbra en la fecha baja; retorna a contabilidad en 15 días después de la baja';
                break;
            case 'Renuncia Voluntaria':
                $descFiniquito = '*Se timbra el finiquito hasta en 5 días; 10 días después retorna a contabilidad';
                break;
            default:
                $descFiniquito = '';
        }
        $sheet->fromArray([
            $fila['DEPARTAMENTO INTERNO'],
            $fila['CENTRO DE COSTOS'],
            $sueldo,
            $fechaIngreso && $fechaIngreso !== '0000-00-00' ? date('d/m/Y', strtotime($fechaIngreso)) : '',
            $fila['APELLIDOS'],
            $fila['NOMBRES'],
            $fila['RFC'],
            $fila['CURP'],
            $fila['NSS'],
            $fila['Codigo Fiscal'],
            $fecha_baja && $fecha_baja !== '0000-00-00' ? date('d/m/Y', strtotime($fecha_baja)) : '',
            $diasVac,
            $fila['diasLaborados'] ?? '',
            $fila['pagoDiasLaborados'] ?? '',
            $tipoFiniquito,
            $descFiniquito
        ], null, 'A' . $rowNum);
        // Pintar fila si ya tiene Folio y Fecha baja IDSE
        $folioIDSE = isset($fila['Folio_idse_baja']) ? trim($fila['Folio_idse_baja']) : '';
        $fechaIDSE = isset($fila['Fecha_baja_idse']) ? trim($fila['Fecha_baja_idse']) : '';
        $folioValido = $folioIDSE !== '' && strtolower($folioIDSE) !== 'por definir';
        $fechaValida = $fechaIDSE !== '' && $fechaIDSE !== '0000-00-00' && strtolower($fechaIDSE) !== 'por definir';
        if ($folioValido && $fechaValida) {
            $sheet->getStyle('A'.$rowNum.':N'.$rowNum)->applyFromArray([
                'fill' => [
                    'fillType' => Fill::FILL_SOLID,
                    'startColor' => ['rgb' => 'C6EFCE'] // Verde claro
                ]
            ]);
        }
        foreach (range('A', 'P') as $col) {
            $sheet->getStyle($col . $rowNum)->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);
        }
        $rowNum++;
    }
}

// Descargar
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="bajas_seleccionadas.xlsx"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
exit;
