<?php
require_once("../functions.php");
require_once("../../libraries/fpdf/fpdf.php");
if (comprobar_override(str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__)))
    exit;
$pag = basename($_SERVER['PHP_SELF']);
comprobar_postget("post", ["fecha_ini", "fecha_fin"], $pag, true, "/views/forms/exportar");
gen_plantilla(true, $pag, false, false, '', false, false);
define("MOSTRAR_HORARIOS_TEORICOS_PDF", get_config('mostrar_horarios_teoricos_pdf'));
define("MOSTRAR_APELLIDOS", get_config('mostrar_apellidos_tabla'));
define("MOSTRAR_EXCEDIDAS_PDF", !SISTEMA_INCIDENCIAS && get_config('mostrar_horas_excedidas_exportar') !== '0');
define("MINUTOS_SIN_CONVERSION", get_config('minutos_sin_conversion') == '1');
/*******************************************************************************
 *                              [Obtener los datos]                            *
 *******************************************************************************/
$empleado = filter_input(INPUT_POST, "empleado", FILTER_SANITIZE_SPECIAL_CHARS);
$grupo = filter_input(INPUT_POST, "grupo", FILTER_SANITIZE_NUMBER_INT);
$f_ini = filter_input(INPUT_POST, "fecha_ini", FILTER_SANITIZE_SPECIAL_CHARS);
$f_fin = filter_input(INPUT_POST, "fecha_fin", FILTER_SANITIZE_SPECIAL_CHARS);
$modoFechas = isset($_POST['fechas']);
$porGrupo = isset($_POST['por_grupo']);

if ($modoFechas) {
    $empleado = null;
    $empleado_id = null;
    $grupo = null;
} elseif ($porGrupo) {
    $empleado = null;
    $empleado_id = null;
} else {
    $grupo = null;
}

// Si se busca por nombre completo (nombre + apellidos), buscar el id del empleado
$empleado_id = null;
if (!empty($empleado)) {
    // Buscar por nombre exacto o por nombre + apellidos
    $emp_buscar = consulta(
        "SELECT id FROM empleados WHERE nombre = ? OR CONCAT(nombre, ' ', apellidos) = ? LIMIT 1;",
        [$empleado, $empleado],
        true
    );
    if (!empty($emp_buscar)) {
        $empleado_id = $emp_buscar[0]['id'];
    }
}

$motivo = filter_input(INPUT_POST, "motivo", FILTER_SANITIZE_NUMBER_INT);

// Construcción de la consulta base para traer también el motivo
$colsSubconsulta = ", (SELECT m.nombre 
        FROM aprobaciones_modificaciones_registros amr 
        LEFT JOIN motivos m ON m.id = amr.id_motivo 
        WHERE amr.id_registro = r.id AND amr.id_motivo IS NOT NULL 
        ORDER BY amr.id DESC LIMIT 1) as nombre_motivo";
$colsSubconsultaId = ", (SELECT amr.id_motivo
        FROM aprobaciones_modificaciones_registros amr 
        WHERE amr.id_registro = r.id AND amr.id_motivo IS NOT NULL 
        ORDER BY amr.id DESC LIMIT 1) as id_motivo";

$sql_base = "SELECT r.*, e.apellidos $colsSubconsulta $colsSubconsultaId";
if (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] === "inspector") {
    $sql_base = "SELECT r.*, e.apellidos $colsSubconsulta $colsSubconsultaId FROM registros_inspector r";
} else {
    $sql_base = "SELECT r.*, e.apellidos $colsSubconsulta $colsSubconsultaId FROM registros r";
}

$joins = " LEFT JOIN empleados e ON r.id_empleado = e.id ";
if (!SISTEMA_INSPECTOR || (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] !== "inspector")) {
    $joins = " INNER JOIN empleados e ON r.id_empleado = e.id ";
    if (empty($empleado) && empty($grupo)) {
        $joins = " LEFT JOIN empleados e ON r.id_empleado = e.id ";
    }
}

$where = " WHERE 1=1 ";
$params = [];

if (SISTEMA_INSPECTOR && $_SESSION["tipo_usuario"] === "inspector") {
    // Filtros inspector
} else {
    // Filtros normales
    if ($porGrupo && !empty($grupo)) {
        $where .= " AND e.id_grupo = ? ";
        $params[] = $grupo;
    }
}

if (!empty($empleado_id)) {
    $where .= " AND r.id_empleado = ? ";
    $params[] = $empleado_id;
}

$where .= " AND r.fecha >= ? AND r.fecha <= ? AND r.activo=1 ";
$params[] = $f_ini;
$params[] = $f_fin;

// Filtro por motivo
if (!empty($motivo) && $motivo != -1) {
    $where .= " HAVING id_motivo = ? ";
    $params[] = $motivo;
}

// Orden
$order = " ORDER BY r.nombre, r.fecha, r.id ";
if ($porGrupo && empty($grupo) && (!SISTEMA_INSPECTOR || $_SESSION["tipo_usuario"] !== "inspector")) {
    $order = " ORDER BY e.id_grupo, r.nombre, r.fecha, r.id ";
}

$registros = consulta($sql_base . $joins . $where . $order, $params, true);


$mostrar_vacios = (int) get_config('mostrar_dias_vacios_exportar') === 1;
$filtrando_motivo = (!empty($motivo) && $motivo != -1);

if ($mostrar_vacios && !$filtrando_motivo) {
    $registros = expandir_con_dias_vacios($registros, $empleado, $f_ini, $f_fin, $modoFechas);
}

$dias = [
    "domh",
    "lunh",
    "marh",
    "mieh",
    "jueh",
    "vieh",
    "sabh",
    "domh"
];

/**
 * Devuelve YYYY-MM-DD => ... desde $ini a $fin (ambos incluidos)
 */
function rango_fechas_inclusive($ini, $fin)
{
    $out = [];
    $d = new DateTime($ini);
    $lim = new DateTime($fin);
    while ($d <= $lim) {
        $out[] = $d->format('Y-m-d');
        $d->modify('+1 day');
    }
    return $out;
}

/**
 * Expande $registros para incluir días sin fichaje por empleado.
 * Mantiene el orden por nombre, fecha.
 */
function expandir_con_dias_vacios(array $registros, $empleado, $f_ini, $f_fin, $modoFechas = false)
{
    // Mapa [nombre_completo] => ['id_empleado' => ..., 'nombre' => ..., 'apellidos' => ...]
    $empleados_info = [];
    foreach ($registros as $r) {
        if (isset($r['nombre'])) {
            // Usar nombre completo como clave
            $nombre_completo = MOSTRAR_APELLIDOS && !empty($r['apellidos'])
                ? $r['nombre'] . ' ' . $r['apellidos']
                : $r['nombre'];
            $empleados_info[$nombre_completo] = [
                'id_empleado' => $r['id_empleado'] ?? null,
                'nombre' => $r['nombre'],
                'apellidos' => $r['apellidos'] ?? null
            ];
        }
    }

    // Si se filtró un único empleado pero no hay registros, intenta resolver su id
    if (!empty($empleado) && !isset($empleados_info[$empleado])) {
        $fila = consulta("SELECT id, nombre, apellidos FROM empleados WHERE nombre=? OR CONCAT(nombre, ' ', apellidos)=? LIMIT 1;", [$empleado, $empleado], true);
        if (!empty($fila) && isset($fila[0]['id'])) {
            $nombre_completo = MOSTRAR_APELLIDOS && !empty($fila[0]['apellidos'])
                ? $fila[0]['nombre'] . ' ' . $fila[0]['apellidos']
                : $fila[0]['nombre'];
            $empleados_info[$nombre_completo] = [
                'id_empleado' => $fila[0]['id'],
                'nombre' => $fila[0]['nombre'],
                'apellidos' => $fila[0]['apellidos'] ?? null
            ];
        }
    }

    // Si no hay ningún empleado, no hay nada que expandir
    if (empty($empleados_info))
        return $registros;

    // Índice de fechas existentes por empleado (usando nombre completo)
    $presentes = []; // [nombre_completo][Y-m-d] => true
    foreach ($registros as $r) {
        $nombre_completo = MOSTRAR_APELLIDOS && !empty($r['apellidos'])
            ? $r['nombre'] . ' ' . $r['apellidos']
            : $r['nombre'];
        $fec = isset($r['fecha']) ? (new DateTime($r['fecha']))->format('Y-m-d') : null;
        if ($fec)
            $presentes[$nombre_completo][$fec] = true;
    }

    $todas_fechas = rango_fechas_inclusive($f_ini, $f_fin);
    $faltantes = [];

    foreach ($empleados_info as $nombre_completo => $info) {
        foreach ($todas_fechas as $fec) {
            if (empty($presentes[$nombre_completo][$fec])) {
                // Registro sintético vacío para ese día
                $faltantes[] = [
                    'id' => null,
                    'id_empleado' => $info['id_empleado'],
                    'nombre' => $info['nombre'],
                    'apellidos' => $info['apellidos'],
                    'fecha' => $fec,
                    'hora1' => null,
                    'hora2' => null,
                    'hora3' => null,
                    'hora4' => null,
                    'hora5' => null,
                    'hora6' => null,
                    'hora7' => null,
                    'hora8' => null,
                    'hora9' => null,
                    'hora10' => null,
                    'nombre_motivo' => null // Agregado para consistencia
                ];
            }
        }
    }

    if (!empty($faltantes)) {
        $registros = array_merge($registros, $faltantes);
        // Orden: en modo fechas => fecha, nombre, id; en modo empleado/grupo => nombre, fecha, id
        usort($registros, function ($a, $b) use ($modoFechas) {
            $nom_a = MOSTRAR_APELLIDOS && !empty($a['apellidos'])
                ? $a['nombre'] . ' ' . $a['apellidos']
                : $a['nombre'];
            $nom_b = MOSTRAR_APELLIDOS && !empty($b['apellidos'])
                ? $b['nombre'] . ' ' . $b['apellidos']
                : $b['nombre'];
            if ($modoFechas) {
                $cmp = strcmp($a['fecha'], $b['fecha']);
                if ($cmp !== 0) return $cmp;
                $cmp = strcmp($nom_a, $nom_b);
                if ($cmp !== 0) return $cmp;
            } else {
                $cmp = strcmp($nom_a, $nom_b);
                if ($cmp !== 0) return $cmp;
                $cmp = strcmp($a['fecha'], $b['fecha']);
                if ($cmp !== 0) return $cmp;
            }
            // id puede ser null en sintéticos: ordénalos detrás
            $ai = $a['id'] ?? PHP_INT_MAX;
            $bi = $b['id'] ?? PHP_INT_MAX;
            return $ai <=> $bi;
        });
    }

    return $registros;
}

/*******************************************************************************
 *                   [Creación y configuración de una página]                  *
 *******************************************************************************/
$pdf = new FPDF('L', 'cm', 'A4');
$pdf->AddPage();
$pdf->SetAuthor(SITIO_NOMBRE, true);
$pdf->SetMargins(0, 0, 0);
$pdf->SetAutoPageBreak(true, 1);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetDrawColor(0, 0, 0);
$principio = 0.1;
$salto_p = 0.35;
/*******************************************************************************
 *                                  [Encabezado]                               *
 *******************************************************************************/
/**
 * Encabezado de la página
 */
function header1($pdf, $principio, $f_ini, $f_fin)
{
    $pdf->SetFont('Arial', 'B', 22);
    $pdf->setY($principio);
    if (file_exists('../../assets/img/LOGO.png'))
        $pdf->Image('../../assets/img/LOGO.png', get_config('pdf_margen_izquierdo'), get_config('pdf_margen_superior'), get_config('pdf_tamaño_logo') - 500); //-500 para normalizar
    else
        $pdf->Image('../../assets/img/FICHAPP_V2_NEGRO.png', get_config('pdf_margen_izquierdo'), get_config('pdf_margen_superior'), get_config('pdf_tamaño_logo') - 500); //-500 para normalizar
    $pdf->Ln(1);
    $pdf->setX(11.8);
    $pdf->Cell(2, 1, "Lista de fichajes");
    $pdf->SetFont('Arial', '', 16);
    $pdf->setX(22);
    $pdf->Cell(2, 1, date("d/m/Y", strtotime($f_ini)) . " - " . date("d/m/Y", strtotime($f_fin)));
    $pdf->Ln(1);
}
header1($pdf, $principio, $f_ini, $f_fin);
/*******************************************************************************
 *                                    [Tabla]                                  *
 *******************************************************************************/
/**
 * Forma de tabla
 */
// Comprobar si hay algún motivo en los resultados (siempre que no se haya pedido ocultar)
$mostrar_columna_motivo = false;
if ($motivo != -1) {
    foreach ($registros as $r) {
        if (!empty($r['nombre_motivo'])) {
            $mostrar_columna_motivo = true;
            break;
        }
    }
}

/**
 * Forma de tabla
 */
function tabla($pdf, $modoFechas = false, $mostrar_columna_motivo = false)
{
    $pdf->Rect(2, 3, 26, 15);
    $pdf->Line(2, 4, 28, 4);
    $pdf->SetFont('Arial', 'B', 12);
    $pdf->setY(3);
    //Empleado
    $pdf->setX(2.2);
    $pdf->Cell(2, 1, "Empleado/a");

    // Determinar posición de la línea separadora de empleado
    $linea_empleado_x = 11.5;
    if (!MOSTRAR_HORARIOS_TEORICOS_PDF) {
        if ($mostrar_columna_motivo) {
            $linea_empleado_x = 8.5; // Reducir ancho empleado para meter motivo
        }
    } else {
        $linea_empleado_x = 7.5;
        // Si es modo teórico (estrecho), quizás no tocar o ajustar diferente. 
        // Asumiremos por ahora que el cambio principal es en modo normal/ancho.
    }

    // Dibujar línea separadora empleado
    $pdf->Line($linea_empleado_x, 3, $linea_empleado_x, 18);

    // Motivo (si activo)
    if ($mostrar_columna_motivo) {
        $x_motivo = (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? 8.7 : 7.7; // Ajustar X
        $pdf->setX($x_motivo);
        $pdf->Cell(2, 1, "Motivo");

        // Línea separadora Motivo -> Fecha
        // Usamos la posición original de la línea de empleado como fin de motivo (11.5 en modo ancho)
        $linea_motivo_x = (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? 11.5 : 9.5; // Ajuste para modo estrecho si fuera necesario
        // En modo ancho, la fecha empieza en 12, línea en 11.5 es correcto.

        // Si estamos en modo teórico, fecha empieza en 8. 
        // Si fecha empieza en 8, no hay espacio para nada entre 7.5 y 8.
        // EN MODO TEÓRICO NO CABE.
        // Vamos a implementar solo ajuste fino para modo NO TEÓRICO por ahora (el 99% de los casos del usuario).

        if (!MOSTRAR_HORARIOS_TEORICOS_PDF) {
            $pdf->Line(11.5, 3, 11.5, 18);
        } else {
            // Fallback para modo teórico: Ponerlo al final como antes o ignorar orden si no cabe
            $pdf->setX(25);
            $pdf->Cell(2, 1, "Motivo");
        }
    }

    //Fecha
    (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(12) : $pdf->setX(8);
    $pdf->Cell(2, 1, "Fecha");
    (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->Line(14, 3, 14, 18) : $pdf->Line(10, 3, 10, 18);
    //Entradas/salidas
    (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(16.5) : $pdf->setX(13.5);
    $pdf->Cell(2, 1, 'Realizado');

    // En modo fechas, no mostrar columna Total horas ni la línea separadora
    if (!$modoFechas) {
        (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->Line(23.5, 3, 23.5, 18) : $pdf->Line(19.5, 3, 19.5, 18);
        //Horas totales
        (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(24.5) : $pdf->setX(20);
        $pdf->Cell(2, 1, "Total horas");
        (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? "" : $pdf->Line(23, 3, 23, 18);
    }

    //Horario teórico
    if (SISTEMA_CAMBIO_HORARIO_REGULAR && MOSTRAR_HORARIOS_TEORICOS_PDF && !$modoFechas) {
        $pdf->setX(23);
        $pdf->Cell(2, 1, iconv('UTF-8', 'windows-1252', "Horario teórico"));
    }

    $pdf->Ln(.8);
}
tabla($pdf, $modoFechas, $mostrar_columna_motivo);

function total_paginas($registros, $modoFechas)
{
    $paginas = 0;
    $sumreg = 0;
    $empl_ant = null;

    for ($i = 0; $i < count($registros); $i++) {
        // Construir nombre completo para comparar
        $nombre_actual = MOSTRAR_APELLIDOS && !empty($registros[$i]["apellidos"])
            ? $registros[$i]["nombre"] . " " . $registros[$i]["apellidos"]
            : $registros[$i]["nombre"];
        if ($i === 0 || ($nombre_actual !== $empl_ant && !$modoFechas) || $sumreg > 25) {
            $paginas++;
            $sumreg = 0;
        } else {
            $sumreg++;
        }
        $empl_ant = $nombre_actual;
    }
    return max(1, $paginas);
}


/**
 * Pie de página
 */
function pie($pdf, $total_paginas)
{
    $pdf->SetFont('Arial', '', 12);
    $pdf->setY(18.5);
    $pdf->setX(26.5);
    $pdf->Cell(2, 1, $pdf->PageNo() . "/$total_paginas");
}

$a = 4.55;
$anterior = "";
$sumah = 0;
$sumam = 0;
$suma_excedidas_min = 0; // Acumulador de minutos excedidos (positivos y negativos)
$cantregistros = 0;
$anterior_horario = '';
$total_paginas = total_paginas($registros, $modoFechas);

//Imprimir datos
for ($i = 0; $i < count($registros); $i++) {
    // Construir nombre completo para comparar igual que $anterior
    $nombre_actual = MOSTRAR_APELLIDOS && !empty($registros[$i]["apellidos"])
        ? $registros[$i]["nombre"] . " " . $registros[$i]["apellidos"]
        : $registros[$i]["nombre"];
    // Detectar cambio de empleado (siempre, también en modo fechas para mostrar total)
    $cambioEmpleado = ($i != 0) && ($anterior !== $nombre_actual);
    // Solo salto de página si NO es modo fechas o si hay demasiadas filas
    $saltoEmpleado = $cambioEmpleado && !$modoFechas;
    $saltoPagina = ($cantregistros > 26);

    // En modo fechas, NO mostrar totales por empleado, solo reiniciar acumuladores
    if ($modoFechas && $cambioEmpleado && $i != 0) {
        // Reinicia acumuladores porque empieza otro empleado
        $sumah = 0;
        $sumam = 0;
        $suma_excedidas_min = 0;
    }

    if ($saltoEmpleado || $saltoPagina) {
        if ($saltoEmpleado) {
            // --- PINTA TOTAL del empleado saliente SOLO aquí ---
            $cantregistros = 0;

            // Normaliza acumulado y pinta total
            $sumah += intdiv($sumam, 60);
            $sumam %= 60;
            $horas_sumadas = sprintf("%d:%02d", $sumah, $sumam);

            (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(22) : $pdf->setX(18);
            $pdf->SetFont('Arial', 'B', 12);
            $pdf->Cell(2, 1, "Total");
            (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(25) : $pdf->setX(20.6);
            $pdf->Cell(2, 1, $horas_sumadas);

            // Total excedidas del empleado saliente
            if (MOSTRAR_EXCEDIDAS_PDF && $suma_excedidas_min != 0) {
                $a += 0.5;
                $pdf->Ln(.5);
                (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(19.5) : $pdf->setX(15.5);
                $pdf->SetFont('Arial', 'B', 11);
                $pdf->Cell(2, 1, "Total Excedidas");
                (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(25) : $pdf->setX(20.6);
                $signo = ($suma_excedidas_min >= 0) ? "+" : "-";
                if (!MINUTOS_SIN_CONVERSION) {
                    // Desactivado: conversión a base 60 (H.MM)
                    $h_exc = floor(abs($suma_excedidas_min) / 60);
                    $m_exc = abs($suma_excedidas_min) % 60;
                    $total_excedidas_str = $signo . $h_exc . '.' . str_pad($m_exc, 2, '0', STR_PAD_LEFT);
                } else {
                    // Activado (sin conversión): cálculo normal decimal
                    $hours_exc = abs($suma_excedidas_min) / 60;
                    $total_excedidas_str = $signo . number_format($hours_exc, 2);
                }
                $pdf->Cell(2, 1, $total_excedidas_str);
            }

            // Reinicia acumuladores porque empieza otro empleado
            $sumah = 0;
            $sumam = 0;
            $suma_excedidas_min = 0;

            $pdf->Line(2, $a, 28, $a);

            // Título con el nombre del empleado saliente (solo si NO es modo fechas)
            $pdf->SetFont('Arial', 'B', 18);
            $pdf->setY(1.9);
            // Texto alineado a la derecha en posición fija
            $pdf->setX(12);
            if (!isset($_POST["fechas"]))
                $pdf->Cell(16, 1, iconv('UTF-8', 'windows-1252', $anterior), 0, 0, 'R');
            $pdf->SetFont('Arial', 'B', 12);
        } else {
            // Solo salto de página: NO total, NO reiniciar sumas
            $cantregistros = 0;
            $pdf->Line(2, $a, 28, $a);
        }

        // Pie + nueva página + cabecera en ambos casos
        pie($pdf, $total_paginas);
        $pdf->AddPage();
        header1($pdf, $principio, $f_ini, $f_fin);
        tabla($pdf, $modoFechas, $mostrar_columna_motivo);
        $a = 4.55;
    }


    $cantregistros++;
    //Nombre - mostrar nombre completo si está activa la opción
    $nombre_mostrar = MOSTRAR_APELLIDOS && !empty($registros[$i]["apellidos"])
        ? $registros[$i]["nombre"] . " " . $registros[$i]["apellidos"]
        : $registros[$i]["nombre"];

    // Recortar nombre si es muy largo (límites estrictos para evitar desbordamiento)
    $max_chars = MOSTRAR_HORARIOS_TEORICOS_PDF ? 20 : 35;
    if ($mostrar_columna_motivo && !MOSTRAR_HORARIOS_TEORICOS_PDF) {
        $max_chars = 25; // Reducir chars si mostramos motivo
    }

    if (strlen($nombre_mostrar) > $max_chars) {
        $nombre_mostrar = substr($nombre_mostrar, 0, $max_chars - 3) . "...";
    }

    $pdf->SetFont('Arial', 'B', 12);
    $m = 2;
    $pdf->setX($m);
    $pdf->Cell(2, 1, iconv('UTF-8', 'windows-1252', $nombre_mostrar));

    // Imprimir MOTIVO si activo
    if ($mostrar_columna_motivo && !empty($registros[$i]["nombre_motivo"])) {
        if (!MOSTRAR_HORARIOS_TEORICOS_PDF) {
            // Modo ancho: Motivo entre Empleado y Fecha
            $pdf->SetFont('Arial', '', 10);
            $pdf->setX(8.7);
            $motivo_txt = iconv('UTF-8', 'windows-1252', $registros[$i]["nombre_motivo"]);
            if (strlen($motivo_txt) > 12)
                $motivo_txt = substr($motivo_txt, 0, 10) . '..';
            $pdf->Cell(2, 1, $motivo_txt);
        }
    }

    //Fecha
    (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $m += 9.6 : $m += 5.6;
    $pdf->SetFont('Arial', '', 12);
    $pdf->setX($m);
    $pdf->Cell(2, 1, date("d/m/Y", strtotime($registros[$i]["fecha"])));
    //Horas
    $m += 2.5;
    // Si hay más de 6 horas (existe hora 7), reducimos la fuente
    $hay_muchas_horas = !empty($registros[$i]["hora7"]) && $registros[$i]["hora7"] != "00:00:00";
    if ($hay_muchas_horas) {
        $pdf->SetFont('Arial', '', 8.5);
    }

    for ($h = 1; $h < 11; $h++) {
        $pdf->setX($m);
        if (!empty($registros[$i]["hora$h"]) && $registros[$i]["hora$h"] != "00:00:00" && !empty($registros[$i]["hora" . ($h + 1)]) && $registros[$i]["hora" . ($h + 1)] != "00:00:00") {
            $horas = new DateTime($registros[$i]["hora$h"]);
            $horas1 = new DateTime($registros[$i]["hora" . ($h + 1)]);
            $pdf->Cell(2, 1, $horas->format("G:i") . " - " . $horas1->format("G:i"));
            $h++;
        } elseif (!empty($registros[$i]["hora$h"]) && $registros[$i]["hora$h"] != "00:00:00") {
            $horas = new DateTime($registros[$i]["hora$h"]);
            $pdf->Cell(2, 1, $horas->format("G:i"));
        }

        // Si hay muchas horas (letra pequeña), reducimos el espacio entre columnas
        if ($hay_muchas_horas) {
            $m += 1.82;
        } else {
            $m += 2.7;
        }
    }

    // Restauramos fuente normal
    if ($hay_muchas_horas) {
        $pdf->SetFont('Arial', '', 12);
    }

    // En modo fechas, no mostrar total horas por día
    $total_horas_dia = calculo_horas_totales($registros[$i]["hora1"], $registros[$i]["hora2"], $registros[$i]["hora3"], $registros[$i]["hora4"], $registros[$i]["hora5"], $registros[$i]["hora6"], $registros[$i]["hora7"], $registros[$i]["hora8"], $registros[$i]["hora9"], $registros[$i]["hora10"]);
    if (!$modoFechas) {
        (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(25) : $pdf->setX(20.5);

        $texto_total = $total_horas_dia;
        // Calcular diferencia si la configuración está activada
        if (MOSTRAR_EXCEDIDAS_PDF && $total_horas_dia) {
            $teoricas = calcular_horas_teoricas_dia($registros[$i]["id_empleado"], $registros[$i]["fecha"]);
            if ($teoricas) {
                $diff = calcular_diferencia_horas($total_horas_dia, $teoricas);
                if ($diff != "0" && $diff !== false) {
                    $texto_total .= " " . $diff;
                    // Acumular minutos excedidos para el total
                    $t_real = explode(':', $total_horas_dia);
                    $t_teo = explode(':', $teoricas);
                    $suma_excedidas_min += (($t_real[0] * 60) + $t_real[1]) - (($t_teo[0] * 60) + $t_teo[1]);
                }
            }
        }

        // Ajustar fuente si es largo (umbral aumentado para permitir diff sin reducir fuente)
        if (strlen($texto_total) > 18) {
            $pdf->SetFont('Arial', '', 10);
            if (!MOSTRAR_HORARIOS_TEORICOS_PDF)
                $pdf->setX(24.5); // Ajuste fino para que quepa
        }

        $pdf->Cell(2, 1, $texto_total);
        $pdf->SetFont('Arial', '', 12); // Restaurar
    }
    //Horas relativas
    if (SISTEMA_CAMBIO_HORARIO_REGULAR && MOSTRAR_HORARIOS_TEORICOS_PDF) {
        $pdf->setX(21);
        $horario_relativo = consulta(
            "SELECT * FROM historial_horarios WHERE id_empleado=? AND fecha_inicio>= ? 
                AND (
                    (fecha_fin IS NOT NULL AND fecha_fin >= ?) -- Si fecha_fin no es NULL, aplicar filtro
                    OR (fecha_fin IS NULL)          -- Si fecha_fin es NULL, usar otra comparación
                ) ORDER BY id DESC LIMIT 1;",
            [$registros[$i]["id_empleado"], $registros[$i]["fecha"], $registros[$i]["fecha"]],
            true
        );
        if (empty($horario_relativo))
            $horario_relativo = consulta(
                "SELECT * FROM empleados WHERE id=?;",
                [$registros[$i]["id_empleado"]],
                true
            );
        //saber día fecha
        $datetime = new DateTime($registros[$i]["fecha"]);
        $diaes = $datetime->format('N');
        $hora1 = new DateTime($horario_relativo[0][$dias[$diaes] . "1"]);
        $hora2 = new DateTime($horario_relativo[0][$dias[$diaes] . "2"]);
        $hora3 = new DateTime($horario_relativo[0][$dias[$diaes] . "3"]);
        $hora4 = new DateTime($horario_relativo[0][$dias[$diaes] . "4"]);
        $hora5 = new DateTime($horario_relativo[0][$dias[$diaes] . "5"]);
        $hora6 = new DateTime($horario_relativo[0][$dias[$diaes] . "6"]);
        if ($hora1->format("G:i") . $hora2->format("G:i") . $hora3->format("G:i") . $hora4->format("G:i") . $hora5->format("G:i") . $hora6->format("G:i") != $anterior_horario) {
            $pdf->Cell(2, 1, $hora1->format("G:i") . " - " . $hora2->format("G:i"));
            $pdf->setX(23.5);
            if ($hora3->format("G:i") != "0:00") {
                $pdf->Cell(2, 1, $hora3->format("G:i") . " - " . $hora4->format("G:i"));
                $pdf->setX(25.7);
                if ($hora5->format("G:i") != "0:00") {
                    $pdf->Cell(2, 1, $hora5->format("G:i") . " - " . $hora6->format("G:i"));
                }
            }
            $anterior_horario = $hora1->format("G:i") . $hora2->format("G:i") . $hora3->format("G:i") . $hora4->format("G:i") . $hora5->format("G:i") . $hora6->format("G:i");
        }
    }

    // Imprimir motivo si columna activa en modo teórico (fallback)
    if ($mostrar_columna_motivo && !empty($registros[$i]["nombre_motivo"]) && MOSTRAR_HORARIOS_TEORICOS_PDF) {
        $pdf->SetFont('Arial', '', 10);
        $x_motivo = 25;
        $pdf->setX($x_motivo);
        // Recortar motivo si es muy largo
        $motivo_txt = iconv('UTF-8', 'windows-1252', $registros[$i]["nombre_motivo"]);
        if (strlen($motivo_txt) > 10)
            $motivo_txt = substr($motivo_txt, 0, 8) . '..';
        $pdf->Cell(2, 1, $motivo_txt);
    }

    //Fin línea
    $pdf->Line(2, $a, 28, $a);
    $a += 0.5;
    $pdf->Ln(.5);
    $anterior = MOSTRAR_APELLIDOS && !empty($registros[$i]["apellidos"])
        ? $registros[$i]["nombre"] . " " . $registros[$i]["apellidos"]
        : $registros[$i]["nombre"];
    if (!empty($total_horas_dia)) {
        $hs = explode(":", $total_horas_dia);
        $sumah += (int) $hs[0];
        $sumam += (int) $hs[1];
    }
}
if (!$modoFechas) {
    $sumah += intdiv($sumam, 60);
    $sumam %= 60; // Conservar solo el residuo de los minutos
    $horas_sumadas = sprintf("%d:%02d", $sumah, $sumam);
    (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(22) : $pdf->setX(18);
    $pdf->SetFont('Arial', 'B', 12);
    $pdf->Cell(2, 1, "Total");
    (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(25) : $pdf->setX(20.6);
    $pdf->Cell(2, 1, $horas_sumadas);

    // Total excedidas del último empleado
    if (MOSTRAR_EXCEDIDAS_PDF && $suma_excedidas_min != 0) {
        $a += 0.5;
        $pdf->Ln(.5);
        (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(19.5) : $pdf->setX(15.5);
        $pdf->SetFont('Arial', 'B', 11);
        $pdf->Cell(2, 1, "Total Excedidas");
        (!MOSTRAR_HORARIOS_TEORICOS_PDF) ? $pdf->setX(25) : $pdf->setX(20.6);
        $signo = ($suma_excedidas_min >= 0) ? "+" : "-";
        if (!MINUTOS_SIN_CONVERSION) {
            // Desactivado: conversión a base 60 (H.MM)
            $h_exc = floor(abs($suma_excedidas_min) / 60);
            $m_exc = abs($suma_excedidas_min) % 60;
            $total_excedidas_str = $signo . $h_exc . '.' . str_pad($m_exc, 2, '0', STR_PAD_LEFT);
        } else {
            // Activado (sin conversión): cálculo normal decimal
            $hours_exc = abs($suma_excedidas_min) / 60;
            $total_excedidas_str = $signo . number_format($hours_exc, 2);
        }
        $pdf->Cell(2, 1, $total_excedidas_str);
    }

    $sumah = 0;
    $sumam = 0;
    $suma_excedidas_min = 0;
    $pdf->Line(2, $a, 28, $a);
    $pdf->SetFont('Arial', 'B', 18);
    $pdf->setY(1.9);
    // Texto alineado a la derecha en posición fija
    $pdf->setX(12);
    if (!isset($_POST["fechas"]))
        $pdf->Cell(16, 1, iconv('UTF-8', 'windows-1252', $anterior), 0, 0, 'R');
} else {
    // En modo fechas, NO mostrar totales
}
pie($pdf, $total_paginas);
/*******************************************************************************
 *                                   [Exportar]                                *
 *******************************************************************************/
$uniqid = uniqid();
$pdf->output('F', "../../pdf/$f_ini-$f_fin-$uniqid.pdf", true);
header("Location: ../../pdf/$f_ini-$f_fin-$uniqid.pdf");
