<?php
require __DIR__ . '/../../../vendor/autoload.php';
require_once(__DIR__ . '/../../db/conexion.php');

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

// Ruta del archivo de plantilla
$rutaArchivo = __DIR__ . '/../../plantilla/plantillas_excel/Plantilla Conta Rocasa.xlsx';
$spreadsheet = IOFactory::load($rutaArchivo);
$hoja = $spreadsheet->getActiveSheet();

// Obtener CURPs seleccionados si se envían por POST
$curpsSeleccionados = [];
if (isset($_POST['curps'])) {
    $curpsSeleccionados = json_decode($_POST['curps'], true);
    if (!is_array($curpsSeleccionados)) {
        $curpsSeleccionados = [];
    }
}

// Modificar la consulta para filtrar por los seleccionados si existen
$whereCurps = '';
if (!empty($curpsSeleccionados)) {
    $curpsIn = "'" . implode("','", array_map('addslashes', $curpsSeleccionados)) . "'";
    // Forzar colación de ambos lados a latin1_spanish_ci para evitar conflictos
    $whereCurps = " AND p.CURP COLLATE latin1_spanish_ci IN ($curpsIn) ";
}


// Obtener registros de la tabla Plantilla
$sql = "
SELECT 
    p.*, 
    f.Fonacot, 
    f.Cuenta_clave, 
    f.Estado_fiscal,
    f.Calle_fiscal,
    f.Numero_fiscal,
    f.Colonia_fiscal,
    cc.centro_de_costos,
    e.clave AS clave_estado,
    e.clave_sat
FROM Plantilla p
LEFT JOIN Plantilla_datos_financieros f 
    ON p.CURP COLLATE latin1_spanish_ci = f.CURP COLLATE latin1_spanish_ci
LEFT JOIN centros_costos cc 
    ON p.`DEPARTAMENTO INTERNO` = cc.punto_de_venta
LEFT JOIN catalogo_estados_curp e 
    ON f.Estado_fiscal COLLATE latin1_spanish_ci = e.estado COLLATE latin1_spanish_ci
WHERE p.Estatus = 'ACTIVO' $whereCurps
";

$result = $conn->query($sql);

$fila = 2; // Comenzamos en la fila 2 para dejar la fila 1 como encabezado

// Función para formatear fechas a dd/mm/yyyy
function formatFechaExcel($fecha) {
    if (!$fecha || $fecha === '0000-00-00' || $fecha === '30/12/1899') return '30/12/1899';
    if (strpos($fecha, '/') !== false) return $fecha; // Ya está en formato correcto
    $partes = explode('-', $fecha);
    if (count($partes) === 3) return $partes[2] . '/' . $partes[1] . '/' . $partes[0];
    return $fecha;
}

function normalizarTextoBanorte($valor) {
    if ($valor === null) {
        return '';
    }

    if (!is_string($valor)) {
        return $valor;
    }

    $texto = trim($valor);
    $texto = strtr($texto, [
        "\xC3\x81" => 'A', "\xC3\x89" => 'E', "\xC3\x8D" => 'I', "\xC3\x93" => 'O', "\xC3\x9A" => 'U',
        "\xC3\xA1" => 'a', "\xC3\xA9" => 'e', "\xC3\xAD" => 'i', "\xC3\xB3" => 'o', "\xC3\xBA" => 'u',
        "\xC3\x9C" => 'U', "\xC3\xBC" => 'u', "\xC3\x87" => 'C', "\xC3\xA7" => 'c',
        "\xC3\x91" => 'N', "\xC3\xB1" => 'n'
    ]);

    $texto = preg_replace('/[^A-Za-z0-9 ]+/', ' ', $texto);
    $texto = preg_replace('/\s+/', ' ', $texto);

    return trim($texto);
}

while ($row = $result->fetch_assoc()) {
    $genero = $row['GENERO'] === 'H' ? 'M' : ($row['GENERO'] === 'M' ? 'F' : '');
    $fechaReingreso = empty($row['FECHA REINGRESO']) ? '30/12/1899' : $row['FECHA REINGRESO'];
    $fechaIngreso = $row['FECHA DE INGRESO'];
    // Lógica para la columna C (Fecha de baja)
    $fechaBajaDef = isset($row['FECHA BAJA DEFINITIVA']) ? $row['FECHA BAJA DEFINITIVA'] : '';
    $fechaBaja = isset($row['Fecha Baja']) ? $row['Fecha Baja'] : '';
    // Considerar '0000-00-00' como vacío/null
    if ($fechaBajaDef === '0000-00-00') $fechaBajaDef = '';
    if ($fechaBaja === '0000-00-00') $fechaBaja = '';
    if (!empty($fechaBajaDef)) {
        $valorColumnaC = $fechaBajaDef;
    } elseif (!empty($fechaBaja)) {
        $valorColumnaC = $fechaBaja;
    } else {
        $valorColumnaC = '30/12/1899';
    }
    // Formatear fechas
    $fechaIngreso = formatFechaExcel($fechaIngreso);
    $valorColumnaC = formatFechaExcel($valorColumnaC);
    $fechaReingreso = formatFechaExcel($fechaReingreso);
    $fechaNacimiento = isset($row['FECHA NACIMIENTO']) ? formatFechaExcel($row['FECHA NACIMIENTO']) : '';

    // Asignar columnas según la plantilla
    $hoja->setCellValue("A$fila", ''); // Código
    $hoja->setCellValue("B$fila", $fechaIngreso); // Fecha de alta
    $hoja->setCellValue("C$fila", $valorColumnaC); // Fecha de baja
    $hoja->setCellValue("D$fila", $fechaReingreso); // Fecha de reingreso
    $hoja->setCellValue("E$fila", '01'); // Tipo de contrato
    $hoja->setCellValue("F$fila", normalizarTextoBanorte($row['APELLIDO PATERNO'])); // Apellido paterno
    $hoja->setCellValue("G$fila", normalizarTextoBanorte($row['APELLIDO MATERNO'])); // Apellido materno
    $hoja->setCellValue("H$fila", normalizarTextoBanorte($row['NOMBRES'])); // Nombre
    $hoja->setCellValue("I$fila", 'Quincenal'); // Tipo de periodo
    $hoja->setCellValue("J$fila", 315.04); // Salario diario
    $hoja->setCellValue("K$fila", 330.58); // SBC parte fija
    $hoja->setCellValue("L$fila", 'F'); // Base de cotización
    $hoja->setCellValue("M$fila", 'A'); // Estatus empleado
    $hoja->setCellValue("N$fila", normalizarTextoBanorte($row['centro_de_costos'] ?? '')); // Departamento
    $hoja->setCellValue("O$fila", 'C'); // Sindicalizado
    $hoja->setCellValue("P$fila", 'S'); // Base de pago
    $hoja->setCellValue("Q$fila", '03'); // Método de pago
    $hoja->setCellValue("R$fila", 'Matutino'); // Turno de trabajo
    $hoja->setCellValue("S$fila", 'A'); // Zona de salario
    $hoja->setCellValue("T$fila", ''); // Campo extra 1
    $hoja->setCellValue("U$fila", ''); // Campo extra 2
    $hoja->setCellValue("V$fila", ''); // Campo extra 3
    $hoja->setCellValue("W$fila", ''); // Afore
    $hoja->setCellValue("X$fila", ''); // Expediente
    $hoja->setCellValue("Y$fila", $row['NSS']); // Num seguridad social
    $hoja->setCellValue("Z$fila", $row['RFC']); // RFC
    $hoja->setCellValue("AA$fila", $row['CURP']); // CURP
    $hoja->setCellValue("AB$fila", $genero); // Sexo (H → M, M → F)
    $hoja->setCellValue("AC$fila", normalizarTextoBanorte($row['CIUDAD'])); // Ciudad de nacimiento
    $hoja->setCellValue("AD$fila", $fechaNacimiento); // Fecha de nacimiento
    $hoja->setCellValue("AE$fila", 0); // UMF
    $hoja->setCellValue("AF$fila", ''); // Nombre del padre
    $hoja->setCellValue("AG$fila", ''); // Nombre de la madre
    $direccionFiscal = '';
    if (!empty($row['Calle_fiscal']) || !empty($row['Numero_fiscal']) || !empty($row['Colonia_fiscal'])) {
        $direccionFiscal = trim(
            ($row['Calle_fiscal'] ?? '') . ' ' .
            ($row['Numero_fiscal'] ?? '') . ' ' .
            ($row['Colonia_fiscal'] ?? '')
        );
    }
    $hoja->setCellValue("AH$fila", normalizarTextoBanorte($direccionFiscal)); // Dirección
    $hoja->setCellValue("AI$fila", normalizarTextoBanorte($row['PUESTO'])); // Puesto
    $hoja->setCellValue("AJ$fila", ''); // Población
    // Para AK, ya se obtiene en la consulta como clave_sat (relacionado con Estado_fiscal y catalogo_estados_curp)
    $hoja->setCellValue("AK$fila", $row['clave_sat'] ?? ''); // Entidad federativa de domicilio (clave SAT, según Estado_fiscal)
    $hoja->setCellValue("AL$fila", $row['CPdeRFC']); // CP (CORREGIDO)
    $hoja->setCellValue("AM$fila", 'S'); // Estado Civil
    $hoja->setCellValue("AN$fila", $row['TELEFONO PERSONAL']); // Teléfono
    $hoja->setCellValue("AO$fila", 0); // Aviso pendiente modificación SBC
    $hoja->setCellValue("AP$fila", 0); // Aviso pendiente reingreso IMSS
    $hoja->setCellValue("AQ$fila", 0); // Aviso pendiente baja IMSS
    $hoja->setCellValue("AR$fila", 0); // Aviso pendiente cambio base cotización
    $hoja->setCellValue("AS$fila", $fechaIngreso); // Fecha del salario diario
    $hoja->setCellValue("AT$fila", $fechaIngreso); // Fecha SBC parte fija
    $hoja->setCellValue("AU$fila", 0); // Salario variable
    $hoja->setCellValue("AV$fila", $fechaIngreso); // Fecha salario variable
    $hoja->setCellValue("AW$fila", 0); // Salario promedio
    $hoja->setCellValue("AX$fila", $fechaIngreso); // Fecha salario promedio
    $hoja->setCellValue("AY$fila", 315.04); // Salario base liquidación
    $hoja->setCellValue("AZ$fila", 0.6); // Saldo del ajuste al neto
    $hoja->setCellValue("BA$fila", 1); // Cálculo PTU
    $hoja->setCellValue("BB$fila", 1); // Cálculo aguinaldo
    $hoja->setCellValue("BC$fila", ''); // Banco para pago electrónico
    $hoja->setCellValue("BD$fila", ''); // Numero de cuenta para pago electrónico
    $hoja->setCellValue("BE$fila", ''); // Sucursal para pago electrónico
    $hoja->setCellValue("BF$fila", ''); // Causa de la última baja
    $hoja->setCellValue("BG$fila", 0); // Campo extra numérico 1
    $hoja->setCellValue("BH$fila", 0); // Campo extra numérico 2
    $hoja->setCellValue("BI$fila", 0); // Campo extra numérico 3
    $hoja->setCellValue("BJ$fila", 0); // Campo extra numérico 4
    $hoja->setCellValue("BK$fila", 0); // Campo extra numérico 5
    $hoja->setCellValue("BL$fila", $fechaIngreso); // Fecha salario mixto
    $hoja->setCellValue("BM$fila", 0); // Salario mixto
    $hoja->setCellValue("BN$fila", 'Z3822103100'); // Registro patronal del IMSS
    $hoja->setCellValue("BO$fila", $row['Fonacot']); // Número FONACOT
    $hoja->setCellValue("BP$fila", $row['CORREO_PERSONAL']); // Correo electrónico
    $hoja->setCellValue("BQ$fila", '02'); // Tipo de régimen
    $hoja->setCellValue("BR$fila", $row['Cuenta_clave']); // CLABE interbancaria
    // Para BS, obtener los dos caracteres del estado de nacimiento desde el CURP (posiciones 12 y 13, base 1)
    $curp = isset($row['CURP']) ? $row['CURP'] : '';
    $entidadCurp = '';
    if (strlen($curp) >= 13) {
        $entidadCurp = substr($curp, 11, 2); // 12 y 13 en base 1
    }
    $hoja->setCellValue("BS$fila", $entidadCurp); // Entidad federativa de nacimiento (del CURP)
    $hoja->setCellValue("BT$fila", 'Confianza'); // Tipo de prestación
    $hoja->setCellValue("BU$fila", 0); // Extranjero sin CURP
    $hoja->setCellValue("BV$fila", 0); // Tipo de semana reducida
    $hoja->setCellValue("BW$fila", 0); // Días vacaciones tomadas antes de alta
    $hoja->setCellValue("BX$fila", 0); // Días prima vacacional tomadas antes de alta
    $hoja->setCellValue("BY$fila", 0); // Teletrabajador
    $hoja->setCellValue("BZ$fila", ''); // Equipo
    $hoja->setCellValue("CA$fila", ''); // Insumo
    $hoja->setCellValue("CB$fila", ''); // Dirección Teletrabajo
    $hoja->setCellValue("CC$fila", ''); // Líder
    $hoja->setCellValue("CD$fila", 0); // Empleado en Colabora


    $fila++;
}

// Guardar el archivo generado
$nombreArchivo = 'Exportacion_Plantilla_Conta.xlsx';
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save(__DIR__ . "/$nombreArchivo");

header("Content-Disposition: attachment; filename=\"$nombreArchivo\"");
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
readfile(__DIR__ . "/$nombreArchivo");
exit;
