<?php
require '../../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

require_once __DIR__ . '/../config/database.php';

$quincena = isset($_GET['quincena']) ? intval($_GET['quincena']) : 0;
$region = isset($_GET['region']) ? trim($_GET['region']) : '';
$pdv = isset($_GET['pdv']) ? trim($_GET['pdv']) : '';
$colaboradores = isset($_GET['colaborador']) ? (array)$_GET['colaborador'] : [];

if (!$quincena) {
    die('Quincena requerida');
}

$db = new Database();
$conn = $db->connect();

$params = [$quincena];
// JOIN con sectoresdPDVs para obtener el sector correcto
$where = 'WHERE q.id_quincena = ?';
if ($region) {
    $where .= ' AND s.Sector = ?';
    $params[] = $region;
}
if ($pdv) {
    $where .= ' AND p.`DEPARTAMENTO INTERNO` = ?';
    $params[] = $pdv;
}
if (!empty($colaboradores)) {
    $in = implode(',', array_fill(0, count($colaboradores), '?'));
    $where .= " AND h.curp IN ($in)";
    $params = array_merge($params, $colaboradores);
}

$sql = "SELECT h.curp, h.id_horario, p.NOMBRES, p.`APELLIDO PATERNO`, p.`APELLIDO MATERNO`, d.semana, d.dia_semana, d.hora_entrada, d.hora_salida, q.fecha_inicio, q.fecha_fin
        FROM HorariosAsignados h
        JOIN Plantilla p ON h.curp = p.CURP
        JOIN Quincenas q ON h.id_quincena = q.id_quincena
        JOIN DetalleHorariosSemana d ON h.id_horario = d.id_horario
        JOIN sectoresdPDVs s ON FIND_IN_SET(p.`DEPARTAMENTO INTERNO`, s.Tiendas) > 0
        $where
        ORDER BY p.NOMBRES, p.`APELLIDO PATERNO`, p.`APELLIDO MATERNO`, d.semana, d.dia_semana";
$stmt = $conn->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Calcular fechas exactas para cada registro
function calcularFecha($fecha_inicio, $fecha_fin, $semana, $dia_semana) {
    $inicio = new DateTime($fecha_inicio);
    $fin = new DateTime($fecha_fin);
    $diaSemanaMap = [1=>'Lunes',2=>'Martes',3=>'Miércoles',4=>'Jueves',5=>'Viernes',6=>'Sábado',0=>'Domingo'];
    $diasEnQuincena = [];
    for ($d = clone $inicio; $d <= $fin; $d->modify('+1 day')) {
        $diaNombre = $diaSemanaMap[(int)$d->format('w')];
        $diasEnQuincena[] = [
            'fecha' => $d->format('Y-m-d'),
            'dia_semana' => $diaNombre
        ];
    }
    // Agrupar por semana
    $semanasFechas = [[],[],[]];
    $idx = 0;
    $semanaIdx = 0;
    while ($idx < count($diasEnQuincena)) {
        $dia = $diasEnQuincena[$idx];
        $semanasFechas[$semanaIdx][] = $dia;
        if ($dia['dia_semana'] === 'Domingo' && $idx < count($diasEnQuincena)-1) {
            $semanaIdx++;
        }
        $idx++;
    }
    $fechaSemanaDia = null;
    if (isset($semanasFechas[$semana-1])) {
        foreach ($semanasFechas[$semana-1] as $diaObj) {
            if ($diaObj['dia_semana'] === $dia_semana) {
                $fechaSemanaDia = $diaObj['fecha'];
                break;
            }
        }
    }
    return $fechaSemanaDia;
}

// Agrupar por colaborador
$data = [];
$descansos_cache = [];
$vacaciones_cache = [];
$incidencias_cache = [];
foreach ($rows as $row) {
    $curp = $row['curp'];
    $id_horario = $row['id_horario'];
    // Formato: APELLIDO PATERNO APELLIDO MATERNO NOMBRES (sin comas)
    $partes = [];
    if (!empty($row['APELLIDO PATERNO'])) $partes[] = trim($row['APELLIDO PATERNO']);
    if (!empty($row['APELLIDO MATERNO'])) $partes[] = trim($row['APELLIDO MATERNO']);
    if (!empty($row['NOMBRES'])) $partes[] = trim($row['NOMBRES']);
    $nombre = implode(' ', $partes);
    $fecha = calcularFecha($row['fecha_inicio'], $row['fecha_fin'], $row['semana'], $row['dia_semana']);
    if (!$fecha) continue;
    // Consultar días de descanso solo una vez por id_horario
    if (!isset($descansos_cache[$id_horario])) {
        $stmtDesc = $conn->prepare('SELECT dia_semana, fecha_descanso FROM DiasDescanso WHERE id_horario = ? AND id_quincena = ?');
        $stmtDesc->execute([$id_horario, $quincena]);
        $descansos_cache[$id_horario] = $stmtDesc->fetchAll(PDO::FETCH_ASSOC);
    }
    $descansos = $descansos_cache[$id_horario];
    // Consultar vacaciones solo una vez por curp
    if (!isset($vacaciones_cache[$curp])) {
        $stmtVac = $conn->prepare('SELECT `FECHA INICIAL`, `FECHA FINAL` FROM VacationsHist WHERE CURP = ?');
        $stmtVac->execute([$curp]);
        $vacaciones_cache[$curp] = $stmtVac->fetchAll(PDO::FETCH_ASSOC);
    }
    $vacaciones = $vacaciones_cache[$curp];
    // Consultar incidencias capturadas solo una vez por curp (usando CURP y campo Incidencia)
    if (!isset($incidencias_cache[$curp])) {
        $stmtInc = $conn->prepare('SELECT CURP, fechaInicio, fechaFin, Incidencia, Estatus, goceDeSueldo, horasPermiso FROM IncidenciasCaptur WHERE CURP = ? AND Estatus = "Validado por RH"');
        $stmtInc->execute([$curp]);
        $incidencias_cache[$curp] = $stmtInc->fetchAll(PDO::FETCH_ASSOC);
    }
    $incidenciasCaptur = $incidencias_cache[$curp];
    $incidencia = '';
    // Revisar vacaciones primero
    foreach ($vacaciones as $vac) {
        if (!empty($vac['FECHA INICIAL']) && !empty($vac['FECHA FINAL'])) {
            if ($fecha >= $vac['FECHA INICIAL'] && $fecha <= $vac['FECHA FINAL']) {
                $incidencia = 'De Vacaciones';
                break;
            }
        }
    }
    // Si no está de vacaciones, revisar incidencias capturadas
    $goceDeSueldo = '';
    if ($incidencia === '') {
        foreach ($incidenciasCaptur as $inc) {
            if (!empty($inc['fechaInicio']) && !empty($inc['fechaFin'])) {
                if ($fecha >= $inc['fechaInicio'] && $fecha <= $inc['fechaFin']) {
                    $incidencia = $inc['Incidencia'];
                    // Buscar campo goceDeSueldo si existe en el registro
                    if (isset($inc['goceDeSueldo'])) {
                        $goceDeSueldo = $inc['goceDeSueldo'];
                    }
                    break;
                }
            }
        }
    }
    // Si no hay incidencia capturada ni vacaciones, revisar día de descanso
    if ($incidencia === '') {
        foreach ($descansos as $desc) {
            if (!empty($desc['fecha_descanso']) && $desc['fecha_descanso'] === $fecha) {
                $incidencia = 'Día de descanso';
                break;
            }
        }
    }
    // Siempre mostrar Incidencia - goceDeSueldo (formateando el goceDeSueldo si es Con o Sin)
    $goceDeSueldoTexto = $goceDeSueldo;
    if ($goceDeSueldo === 'Con') {
        $goceDeSueldoTexto = 'Con goce de sueldo';
    } elseif ($goceDeSueldo === 'Sin') {
        $goceDeSueldoTexto = 'Sin goce de sueldo';
    }
    $incidencia_final = $incidencia;
    if ($incidencia !== '' && $goceDeSueldoTexto !== '') {
        $incidencia_final = $incidencia . ' - ' . $goceDeSueldoTexto;
    }
    $data[] = [
        'nombre' => $nombre,
        'fecha' => $fecha,
        'hora_entrada' => $row['hora_entrada'],
        'hora_salida' => $row['hora_salida'],
        'incidencias' => $incidencia_final
    ];
}

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$sheet->setCellValue('A1', 'Nombre completo');
$sheet->setCellValue('B1', 'Fecha');
$sheet->setCellValue('C1', 'Hora de entrada');
$sheet->setCellValue('D1', 'Hora de salida');
$sheet->setCellValue('E1', 'Incidencias');

$rowNum = 2;

// --- Guardar exportación en la base de datos usando el nuevo endpoint ---
$exportacionPayload = [
    'quincena_id' => $quincena,
    'fecha_inicio' => $rows[0]['fecha_inicio'] ?? null,
    'fecha_fin' => $rows[0]['fecha_fin'] ?? null,
    'registros' => $data
];
try {
    $endpointUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') .
        '://' . $_SERVER['HTTP_HOST'] .
        dirname($_SERVER['REQUEST_URI']) . '/guardar_exportacion.php';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $endpointUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($exportacionPayload));
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    // Puedes loguear $response si lo deseas
} catch (Exception $e) {
    // No detener la exportación si falla el guardado, solo loguear si es necesario
}

foreach ($data as $d) {
    $sheet->setCellValue('A'.$rowNum, $d['nombre']);
    $sheet->setCellValue('B'.$rowNum, $d['fecha']);
    $sheet->setCellValue('C'.$rowNum, $d['hora_entrada']);
    $sheet->setCellValue('D'.$rowNum, $d['hora_salida']);
    $sheet->setCellValue('E'.$rowNum, $d['incidencias']);

    // Pintar la fila según la incidencia
    if ($d['incidencias'] === 'Día de descanso') {
        $color = 'FFFF00'; // Amarillo
    } elseif ($d['incidencias'] === 'De Vacaciones') {
        $color = 'FFA500'; // Naranja
    } else {
        $color = null;
    }
    if ($color) {
        $sheet->getStyle('A'.$rowNum.':E'.$rowNum)->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
            ->getStartColor()->setARGB($color);
    }
    $rowNum++;
}

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