<?php
session_start();
// Mostrar errores solo si se ejecuta desde navegador
if (php_sapi_name() !== 'cli') {
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
}

// Registrar todos los errores en un archivo de log personalizado
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/error_log.txt');

file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - INICIO SCRIPT\n", FILE_APPEND);

try {
    file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Dentro del try\n", FILE_APPEND);
    require_once __DIR__ . '/../db/conexion.php';
    require_once __DIR__ . '/../utils/normalizar_texto.php';
    require_once __DIR__ . '/../../vendor/autoload.php';
    // Importar clases después del require autoload
    \PhpOffice\PhpSpreadsheet\Spreadsheet::class;
    \PhpOffice\PhpSpreadsheet\Writer\Xlsx::class;
    \PhpOffice\PhpSpreadsheet\Style\Color::class;
    \PhpOffice\PhpSpreadsheet\Style\Fill::class;

    $tipo = $_GET['tipo'] ?? 'activos'; // activos, inactivos, todos

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename="plantilla_empleados_' . $tipo . '_' . date('Ymd_His') . '.xlsx"');
    header('Cache-Control: max-age=0');

    $where = '';
    switch ($tipo) {
        case 'activos':
            $where = "WHERE Estatus = 'ACTIVO'";
            break;
        case 'inactivos':
            $where = "WHERE Estatus != 'ACTIVO'";
            break;
        case 'todos':
        default:
            $where = '';
            break;
    }

    // Unir todas las tablas relevantes por CURP, alias para evitar sobrescribir
    $sql = "SELECT p.CURP AS CURP_PLANTILLA, p.*, dp.*, df.*, o.*
            FROM Plantilla p
            LEFT JOIN Plantilla_datos_personales dp ON p.CURP = dp.CURP
            LEFT JOIN Plantilla_datos_financieros df ON p.CURP = df.CURP
            LEFT JOIN Plantilla_otros o ON p.CURP = o.CURP
            $where
            ORDER BY p.NOMBRES, p.`APELLIDO PATERNO`, p.`APELLIDO MATERNO`";
    $result = $conn->query($sql);
    file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Después de query SQL\n", FILE_APPEND);
    if (!$result) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Error SQL: " . $conn->error . "\n", FILE_APPEND);
        throw new Exception('Error en la consulta SQL: ' . $conn->error);
    }
    $numRows = $result->num_rows;
    file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Filas encontradas: $numRows\n", FILE_APPEND);
    if ($numRows === 0) {
        file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Sin datos para exportar\n", FILE_APPEND);
        header('Content-Type: text/plain; charset=utf-8');
        echo "No se encontraron datos para exportar con el filtro seleccionado (tipo: $tipo).";
        exit;
    }

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

    // Encabezados por bloque (CURP de Plantilla primero, usando el alias)
    $bloques = [
        'Clave' => ['CURP_PLANTILLA'],
        'Información básica' => [
            'NOMBRES', 'APELLIDO PATERNO', 'APELLIDO MATERNO', 'GENERO', 'FECHA NACIMIENTO', 'EDAD', 'Estatus', 'MODALIDAD', 'DEPARTAMENTO INTERNO', 'PUESTO', 'FECHA DE INGRESO', 'AÑOS_EMPRESA'
        ],
        'Datos Personales' => [
            'estado_civil', 'Numero_Hijos', 'Talla', 'Grupo_sanguineo', 'Alergenos', 'Enfermedades_cronicas', 'Tel_personal', 'Nombre_contacto_emergen', 'Tel_contacto_emergen'
        ],
        'Datos Financieros' => [
            'ID', 'ATTUID', 'RFC', /*'CURP',*/ 'NSS', 'SUELDO MENSUAL', 'Vales', 'Banco', 'Tarjeta', 'Cuenta_clave', 'Numero_cuenta', 'CPdeRFC', 'ValesDespensa', 'Numero_empleado_vales'
        ],
        'Contacto' => [
            'CORREO_PERSONAL', 'CORREO CORPORATIVO', 'direccion', 'ESTADO', 'CIUDAD', 'telefonoHerramienta'
        ],
        'Otros' => [
            'Fecha Baja', 'ComentarioBaja'
        ]
    ];
    $colores = [
        'Clave' => 'FFFFF9C4',
        'Información básica' => 'FFCCE5FF',
        'Datos Personales' => 'FFF8BBD0',
        'Datos Financieros' => 'FFD5F5E3',
        'Contacto' => 'FFFFF9C4',
        'Otros' => 'FFFFCDD2'
    ];

    // Encabezados visuales personalizados
    $encabezadosVisibles = [
        'Cuenta_clave' => 'Cuenta Clabe',
    ];

    // Construir encabezados
    $col = 1;
    foreach ($bloques as $bloque => $campos) {
        foreach ($campos as $campo) {
            $colString = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
            $encabezado = isset($encabezadosVisibles[$campo]) ? $encabezadosVisibles[$campo] : $campo;
            $sheet->setCellValue($colString . '1', $encabezado);
            $sheet->getStyle($colString . '1')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB($colores[$bloque]);
            $col++;
        }
    }

    // Llenar datos
    $rowNum = 2;
    while ($row = $result->fetch_assoc()) {
        $col = 1;
        foreach ($bloques as $bloque => $campos) {
            foreach ($campos as $campo) {
                if ($campo === 'EDAD') {
                    $fechaNac = isset($row['FECHA NACIMIENTO']) ? $row['FECHA NACIMIENTO'] : '';
                    $valor = '';
                    if ($fechaNac && strtotime($fechaNac)) {
                        $nacimiento = new DateTime($fechaNac);
                        $hoy = new DateTime();
                        $edad = $hoy->diff($nacimiento)->y;
                        $valor = $edad;
                    }
                } else if ($campo === 'AÑOS_EMPRESA') {
                    $fechaIngreso = isset($row['FECHA DE INGRESO']) ? $row['FECHA DE INGRESO'] : '';
                    $valor = '';
                    if ($fechaIngreso && strtotime($fechaIngreso)) {
                        $ingreso = new DateTime($fechaIngreso);
                        $hoy = new DateTime();
                        $anios = $hoy->diff($ingreso)->y;
                        $valor = $anios;
                    }
                } else {
                    $valor = isset($row[$campo]) && $row[$campo] !== null ? $row[$campo] : '';
                }
                $colString = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($col);
                // Exportar todo como texto para evitar notación científica
                $sheet->setCellValueExplicit($colString . $rowNum, (string)$valor, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
                $col++;
            }
        }
        $rowNum++;
    }

    // Centrar y alinear todas las celdas
    $highestCol = $sheet->getHighestColumn();
    $highestRow = $sheet->getHighestRow();
    $sheet->getStyle('A1:' . $highestCol . $highestRow)
        ->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)
        ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);

    // Ajustar ancho de columnas
    for ($i = 1; $i < $col; $i++) {
        $sheet->getColumnDimensionByColumn($i)->setAutoSize(true);
    }

    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
    file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Antes de save()\n", FILE_APPEND);
    $writer->save('php://output');
    file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Después de save()\n", FILE_APPEND);
    exit;
} catch (Throwable $e) {
    file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . " - Excepción: " . $e->getMessage() . "\n", FILE_APPEND);
    if (ob_get_length()) ob_end_clean();
    header('Content-Type: text/plain; charset=utf-8');
    http_response_code(500);
    echo "Error al generar el Excel: " . $e->getMessage() . "\n" . $e->getTraceAsString();
    exit(1);
}
