<?php
require_once("../../app/functions.php");
if (comprobar_override(str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__)))
    exit;
$pag = basename($_SERVER['PHP_SELF']);

gen_plantilla(true, $pag, true, true, 'Inicio', true, true);

// Mostrar notificación si viene por GET
if (isset($_GET['tipo']) && isset($_GET['mensaje'])) {
    crear_notificacion(filter_input(INPUT_GET, 'tipo', FILTER_SANITIZE_SPECIAL_CHARS), filter_input(INPUT_GET, 'mensaje', FILTER_SANITIZE_SPECIAL_CHARS));
}

//Obtener anterior búsqueda
$fecha = date('Y-m-d');
$filtro = consulta('SELECT * FROM filtro_busqueda WHERE fecha=? AND id_usuario=?;', [$fecha, $_SESSION['id_usuario']], true);
$nombres = consulta(
    "SELECT e.id, e.nombre, e.apellidos, u.id AS id_usuario
    FROM empleados AS e
    LEFT JOIN usuarios AS u ON u.id_empleado=e.id
    ORDER BY e.nombre;",
    [],
    true
);
$motivos = consulta("SELECT * FROM motivos ORDER BY nombre ASC", [], true);
$mostrar_apellidos = get_config('mostrar_apellidos_tabla');

//Mirar aprobaciones pendientes para el empleado
if (isset($_SESSION["tipo_usuario"]) && $_SESSION["tipo_usuario"] == "empleado" && !empty($aprobaciones = consulta('SELECT * FROM aprobaciones_modificaciones_registros WHERE id_empleado=? AND estado="pendiente";', [$_SESSION['id_empleado']], true)))
    crear_notificacion('advertencia', 'Tienes <a href="' . SITIO_CARPETA . '/views/tables/aprobaciones" style="color:var(--cambio-colores)">aprobaciones</a> de modificaciones de registros pendientes');

// Comprobar actualizaciones para admins al iniciar sesión
$alerta_registro_impar = null;
$alerta_sin_usuario = null;
$alerta_sin_horario = null;

if (isset($_SESSION["tipo_usuario"]) && $_SESSION["tipo_usuario"] == "admin") {
    require_once(__DIR__ . '/../../app/version.php');
    $api_key = md5('Comprobar_actualizaciones_FichApp');
    $update_url = 'https://update.tufichaje.app/api.php?api_key=' . $api_key . '&version=' . urlencode($version);

    $context = stream_context_create([
        'http' => ['timeout' => 5],
        'ssl' => ['verify_peer' => false, 'verify_peer_name' => false]
    ]);

    $response = @file_get_contents($update_url, false, $context);
    if ($response !== false) {
        $data = json_decode($response, true);
        if ($data && isset($data['update_available']) && $data['update_available'] === true) {
            $new_version = $data['update_info']['new_version'] ?? 'nueva versión';
            crear_notificacion('error', 'Hay una <a href="' . SITIO_CARPETA . '/views/actualizaciones" style="color:var(--cambio-colores)">actualización disponible</a> (v' . $new_version . ').');
        }
    }

    // ALERTA 1: Comprobar registros con horas impares (sin contar hoy)
    $registro_impar = consulta(
        "SELECT r.id, r.fecha, e.nombre, e.apellidos,
         (CASE WHEN hora1 IS NOT NULL AND hora1 != '' AND hora1 != '00:00:00' THEN 1 ELSE 0 END +
          CASE WHEN hora2 IS NOT NULL AND hora2 != '' AND hora2 != '00:00:00' THEN 1 ELSE 0 END +
          CASE WHEN hora3 IS NOT NULL AND hora3 != '' AND hora3 != '00:00:00' THEN 1 ELSE 0 END +
          CASE WHEN hora4 IS NOT NULL AND hora4 != '' AND hora4 != '00:00:00' THEN 1 ELSE 0 END +
          CASE WHEN hora5 IS NOT NULL AND hora5 != '' AND hora5 != '00:00:00' THEN 1 ELSE 0 END +
          CASE WHEN hora6 IS NOT NULL AND hora6 != '' AND hora6 != '00:00:00' THEN 1 ELSE 0 END) AS total_horas
        FROM registros r
        LEFT JOIN empleados e ON r.id_empleado = e.id
        WHERE r.fecha < CURDATE() AND r.activo = 1
        HAVING total_horas % 2 = 1
        ORDER BY r.fecha DESC
        LIMIT 1;",
        [],
        true
    );
    if (!empty($registro_impar)) {
        $nombre_emp = $registro_impar[0]['nombre'] . (!empty($registro_impar[0]['apellidos']) ? ' ' . $registro_impar[0]['apellidos'] : '');
        $fecha_fmt = date('d/m/Y', strtotime($registro_impar[0]['fecha']));
        $alerta_registro_impar = ['id' => $registro_impar[0]['id'], 'nombre' => $nombre_emp, 'fecha' => $fecha_fmt];
    }

    // ALERTA 2: Empleados sin usuario configurado
    $empleados_sin_usuario = consulta(
        "SELECT e.id, e.nombre, e.apellidos 
         FROM empleados e
         LEFT JOIN usuarios u ON u.id_empleado = e.id
         WHERE u.id IS NULL
         LIMIT 1;",
        [],
        true
    );
    if (!empty($empleados_sin_usuario)) {
        $emp = $empleados_sin_usuario[0];
        $nombre_emp = $emp['nombre'] . (!empty($emp['apellidos']) ? ' ' . $emp['apellidos'] : '');
        $alerta_sin_usuario = ['id' => $emp['id'], 'nombre' => $nombre_emp];
    }

    // ALERTA 3: Empleados sin horario configurado (verifica empleado Y grupo)
    // Solo muestra alerta si ni el empleado ni su grupo tienen horario asignado (fijo o flexible)
    $empleados_sin_horario = consulta(
        "SELECT e.id, e.nombre, e.apellidos
         FROM empleados e
         LEFT JOIN grupos g ON e.id_grupo = g.id
         WHERE e.sin_horario_asignado = 0 
         -- Empleado sin horario fijo
         AND (e.lunh1 IS NULL OR e.lunh1 = '' OR e.lunh1 = '00:00:00')
         AND (e.lunh2 IS NULL OR e.lunh2 = '' OR e.lunh2 = '00:00:00')
         AND (e.marh1 IS NULL OR e.marh1 = '' OR e.marh1 = '00:00:00')
         AND (e.marh2 IS NULL OR e.marh2 = '' OR e.marh2 = '00:00:00')
         AND (e.mieh1 IS NULL OR e.mieh1 = '' OR e.mieh1 = '00:00:00')
         AND (e.mieh2 IS NULL OR e.mieh2 = '' OR e.mieh2 = '00:00:00')
         AND (e.jueh1 IS NULL OR e.jueh1 = '' OR e.jueh1 = '00:00:00')
         AND (e.jueh2 IS NULL OR e.jueh2 = '' OR e.jueh2 = '00:00:00')
         AND (e.vieh1 IS NULL OR e.vieh1 = '' OR e.vieh1 = '00:00:00')
         AND (e.vieh2 IS NULL OR e.vieh2 = '' OR e.vieh2 = '00:00:00')
         -- Y además: no tiene grupo, o el grupo tampoco tiene horario definido
         AND (
             e.id_grupo IS NULL 
             OR g.id IS NULL
             OR (
                 -- Grupo sin horario fijo (tipo_grupo = 0 pero sin horas definidas)
                 (g.tipo_grupo = 0 
                  AND (g.lunh1 IS NULL OR g.lunh1 = '' OR g.lunh1 = '00:00:00')
                  AND (g.lunh2 IS NULL OR g.lunh2 = '' OR g.lunh2 = '00:00:00')
                  AND (g.marh1 IS NULL OR g.marh1 = '' OR g.marh1 = '00:00:00')
                  AND (g.marh2 IS NULL OR g.marh2 = '' OR g.marh2 = '00:00:00')
                  AND (g.mieh1 IS NULL OR g.mieh1 = '' OR g.mieh1 = '00:00:00')
                  AND (g.mieh2 IS NULL OR g.mieh2 = '' OR g.mieh2 = '00:00:00')
                  AND (g.jueh1 IS NULL OR g.jueh1 = '' OR g.jueh1 = '00:00:00')
                  AND (g.jueh2 IS NULL OR g.jueh2 = '' OR g.jueh2 = '00:00:00')
                  AND (g.vieh1 IS NULL OR g.vieh1 = '' OR g.vieh1 = '00:00:00')
                  AND (g.vieh2 IS NULL OR g.vieh2 = '' OR g.vieh2 = '00:00:00')
                 )
                 -- O grupo flexible sin horas definidas
                 OR (g.tipo_grupo = 1 AND (g.horas IS NULL OR g.horas = '' OR g.horas = '00:00'))
             )
         )
         LIMIT 1;",
        [],
        true
    );
    if (!empty($empleados_sin_horario)) {
        $emp = $empleados_sin_horario[0];
        $nombre_emp = $emp['nombre'] . (!empty($emp['apellidos']) ? ' ' . $emp['apellidos'] : '');
        $alerta_sin_horario = ['id' => $emp['id'], 'nombre' => $nombre_emp];
    }

    // ALERTA 4: Solicitudes de notas pendientes (si el sistema de notas está activo)
    $alerta_solicitudes_notas = null;
    if (get_config('notas')) {
        $solicitudes_pendientes = consulta(
            "SELECT COUNT(*) as total FROM solicitudes_notas WHERE estado = 0;",
            [],
            true
        );
        if (!empty($solicitudes_pendientes) && $solicitudes_pendientes[0]['total'] > 0) {
            $alerta_solicitudes_notas = $solicitudes_pendientes[0]['total'];
        }
    }
}
?>
<?php // ALERTA 1: Registro con horas impares (nivel 1 - más arriba)
if ($alerta_registro_impar):
    crear_notificacion_inline('advertencia', 'El registro de <b>' . htmlspecialchars($alerta_registro_impar['nombre']) . '</b> del ' . $alerta_registro_impar['fecha'] . ' tiene horas impares. <a href="javascript:void(0)" onclick="modificar_registro(' . $alerta_registro_impar['id'] . ')" style="color:var(--cambio-colores)">Editar registro</a>', 1);
endif; ?>


<section class="cristal" <?= (!get_config_usuario($_SESSION['id_usuario'], 'reducir_efectos_movimiento')) ? 'style="view-transition-name: cristal;padding-bottom:3.5rem;"' : 'style="padding-bottom:3.5rem;"' ?>>
    <h1 class="resaltado flex row supercentrado"><span class="animacion-izq-drch">📋</span> Historial de registros</h1>
    <section class="flex column gap1 alineado">
        <section class="flex row supercentrado gap1 row-column">
            <?php if ($_SESSION['tipo_usuario'] == "empleado"):
                $esta_de_baja = consulta(
                    "SELECT 1 FROM bajas_empleado WHERE id_empleado=? AND (fecha_incorporacion IS NULL OR fecha_incorporacion > CURDATE())",
                    [$_SESSION['id_empleado']],
                    true
                );
                if (empty($esta_de_baja)): ?>
                <button class="btn-p" onclick="llamar_dialog_fichar()">Fichar</button>
            <?php endif; endif; ?>
            <?php if ($_SESSION['tipo_usuario'] == "admin"): ?>
                <a href="<?= SITIO_CARPETA ?>/views/forms/crear_registro" class="btn-p">Crear registro</a>
            <?php endif; ?>
            <?php if (SISTEMA_INSPECTOR && VER_REGISTROS_INSPECTOR && $_SESSION['tipo_usuario'] == "admin"): ?>
                <a href="<?= SITIO_CARPETA ?>/views/tables/registros_inspector" class="btn-p">Registros legales</a>
            <?php endif; ?>
            <a href="<?= SITIO_CARPETA ?>/views/tables/calendario" class="btn-p">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640">
                    <path
                        d="M216 64C229.3 64 240 74.7 240 88L240 128L400 128L400 88C400 74.7 410.7 64 424 64C437.3 64 448 74.7 448 88L448 128L480 128C515.3 128 544 156.7 544 192L544 480C544 515.3 515.3 544 480 544L160 544C124.7 544 96 515.3 96 480L96 192C96 156.7 124.7 128 160 128L192 128L192 88C192 74.7 202.7 64 216 64zM480 496C488.8 496 496 488.8 496 480L496 416L408 416L408 496L480 496zM496 368L496 288L408 288L408 368L496 368zM360 368L360 288L280 288L280 368L360 368zM232 368L232 288L144 288L144 368L232 368zM144 416L144 480C144 488.8 151.2 496 160 496L232 496L232 416L144 416zM280 416L280 496L360 496L360 416L280 416zM216 176L160 176C151.2 176 144 183.2 144 192L144 240L496 240L496 192C496 183.2 488.8 176 480 176L216 176z" />
                </svg>
                Vista calendario
            </a>
        </section>
        <?php
        if ($_SESSION['tipo_usuario'] == 'empleado') {
            $registro_hoy = consulta(
                "SELECT * FROM registros WHERE id_empleado=? AND fecha=CURDATE() AND activo=1",
                [$_SESSION['id_empleado']],
                true
            );

            if (!empty($registro_hoy)) {
                $r = $registro_hoy[0];
                $total_segundos = 0;
                $ultimo_fichaje_impar = false;
                $hay_fichajes = false;

                for ($i = 1; $i <= 9; $i += 2) {
                    $h_in = $r['hora' . $i];
                    $h_out = $r['hora' . ($i + 1)];

                    if (!empty($h_in) && $h_in != '00:00:00') {
                        $hay_fichajes = true;
                        $t_in = strtotime($h_in);
                        if (!empty($h_out) && $h_out != '00:00:00') {
                            $t_out = strtotime($h_out);
                            $total_segundos += ($t_out - $t_in);
                        } else {
                            // Fichaje abierto (impar)
                            $total_segundos += (time() - $t_in);
                            $ultimo_fichaje_impar = true;
                        }
                    }
                }

                if ($hay_fichajes) {
                    // Formatear horas y minutos
                    $horas_llevadas = floor($total_segundos / 3600);
                    $minutos_llevados = floor(($total_segundos % 3600) / 60);
                    $texto_llevas = sprintf("%02d:%02d", $horas_llevadas, $minutos_llevados);

                    echo '<span class="flex supercentrado" style="margin-top:-0.5rem; font-size:2rem; font-weight:bold; color:var(--verde);">Llevas ' . $texto_llevas . 'h</span>';
                }
            }

            // Horas de la semana (lunes a domingo)
            $lunes = date('Y-m-d', strtotime('monday this week'));
            $domingo = date('Y-m-d', strtotime('sunday this week'));
            $registros_semana = consulta(
                "SELECT * FROM registros WHERE id_empleado=? AND fecha BETWEEN ? AND ? AND activo=1",
                [$_SESSION['id_empleado'], $lunes, $domingo],
                true
            );

            $total_seg_semana = 0;
            if (!empty($registros_semana)) {
                foreach ($registros_semana as $rs) {
                    for ($i = 1; $i <= 9; $i += 2) {
                        $h_in = $rs['hora' . $i];
                        $h_out = $rs['hora' . ($i + 1)];
                        if (!empty($h_in) && $h_in != '00:00:00') {
                            $t_in = strtotime($rs['fecha'] . ' ' . $h_in);
                            if (!empty($h_out) && $h_out != '00:00:00') {
                                $t_out = strtotime($rs['fecha'] . ' ' . $h_out);
                                $total_seg_semana += ($t_out - $t_in);
                            } elseif ($rs['fecha'] == date('Y-m-d')) {
                                $total_seg_semana += (time() - $t_in);
                            }
                        }
                    }
                }
            }

            $horas_semana = floor($total_seg_semana / 3600);
            $minutos_semana = floor(($total_seg_semana % 3600) / 60);
            $texto_semana = sprintf("%02d:%02d", $horas_semana, $minutos_semana);
            echo '<span class="flex supercentrado" style="font-size:0.9rem; color:var(--azul);">Esta semana llevas trabajado ' . $texto_semana . 'h</span>';
        }
        ?>
        <article class="flex row gap1 supercentrado wrap row-column">
            <label class="flex column gap02" id="label-nombre" <?php if ($_SESSION['tipo_usuario'] == 'empleado')
                echo 'style="display:none;"'; ?>>
                <b>Empleado</b>
                <input type="search" list="nombres" name="nombre" id="nombre"
                    placeholder="<?= $mostrar_apellidos ? 'Nombre o apellidos' : 'Nombre' ?>" <?php
                          if ($_SESSION['tipo_usuario'] == 'empleado') {
                              for ($i = 0; $i < count($nombres); $i++) {
                                  if ($nombres[$i]['id_usuario'] == $_SESSION['id_usuario']) {
                                      echo ' value="' . $nombres[$i]['nombre'] . '"';
                                      $nombre_empleado = $nombres[$i]['nombre'];
                                      break;
                                  }
                              }
                          } elseif (!empty($filtro)) {
                              echo "value='" . $filtro[0]['nombre'] . "'";
                          }
                          ?>>
            </label>
            <datalist id="nombres">
                <?php
                if (!empty($nombres))
                    for ($i = 0; $i < count($nombres); $i++) {
                        $nombre_completo = $mostrar_apellidos && !empty($nombres[$i]["apellidos"])
                            ? $nombres[$i]["nombre"] . " " . $nombres[$i]["apellidos"]
                            : $nombres[$i]["nombre"];
                        echo "<option value='" . $nombre_completo . "'>" . $nombre_completo . "</option>";
                    }
                if (get_config('mostrar_empleados_eliminados')) {
                    $nombres_eliminados = consulta("SELECT id_empleado,nombre FROM empleados_eliminados ORDER BY nombre;", [], true);
                    if (!empty($nombres_eliminados))
                        for ($i = 0; $i < count($nombres_eliminados); $i++) {
                            echo "<option value='" . $nombres_eliminados[$i]["nombre"] . "'>" . $nombres_eliminados[$i]["id_empleado"] . " (Eliminado)</option>";
                        }
                }
                ?>
            </datalist>
            <label class="flex column gap02"><b>Desde</b>
                <input type="date" name="fecha_ini" id="fecha_ini" <?= (!empty($filtro)) ? "value='" . $filtro[0]['fecha_inicio'] . "'" : "value='" . date("Y-m") . "-01'" ?> max="<?= date("Y-m-d") ?>">
            </label>
            <label class="flex column gap02"><b>Hasta</b>
                <input type="date" name="fecha_fin" id="fecha_fin" <?= (!empty($filtro)) ? "value='" . $filtro[0]['fecha_fin'] . "'" : "value='" . date("Y-m-t") . "'" ?>>
            </label>
            <?php if ($_SESSION['tipo_usuario'] != 'empleado'): ?>
                <label class="flex column gap02"><b>Motivo</b>
                    <select id="filtro_motivo" name="filtro_motivo" style="max-width: 200px;">
                        <option value="">Todos los motivos</option>
                        <?php foreach ($motivos as $motivo): ?>
                            <option value="<?= $motivo['id'] ?>" <?= (!empty($filtro) && $filtro[0]['id_motivo'] == $motivo['id']) ? 'selected' : '' ?>><?= $motivo['nombre'] ?></option>
                        <?php endforeach; ?>
                    </select>
                </label>
            <?php else: ?>
                <input type="hidden" id="filtro_motivo" value="">
            <?php endif; ?>
            <section class="flex column gap1">
                <span style="height: .4rem;"></span>
                <button id="borrar_filtros" class="btn-s">Borrar filtros</button>
            </section>
        </article>
        <article id="cargando"></article>
        <section id="registros"></section>

    </section>
</section>

<?php // ALERTA 2: Empleados sin usuario (nivel 2 - medio)
if ($alerta_sin_usuario):
    crear_notificacion_inline('info', '<b>' . htmlspecialchars($alerta_sin_usuario['nombre']) . '</b> no tiene usuario. <a href="' . SITIO_CARPETA . '/views/forms/empleado?id=' . $alerta_sin_usuario['id'] . '" style="color:var(--cambio-colores)">Editar empleado</a>', 2);
endif; ?>

<?php // ALERTA 3: Empleados sin horario (nivel 3 - más abajo)
if ($alerta_sin_horario):
    crear_notificacion_inline('info', '<b>' . htmlspecialchars($alerta_sin_horario['nombre']) . '</b> no tiene horario. <a href="' . SITIO_CARPETA . '/views/forms/empleado?id=' . $alerta_sin_horario['id'] . '" style="color:var(--cambio-colores)">Configurar horario</a>', 3);
endif; ?>

<?php // ALERTA 4: Solicitudes de notas pendientes (nivel 4 - después de sin horario)
if (isset($alerta_solicitudes_notas) && $alerta_solicitudes_notas > 0):
    crear_notificacion_inline('info', 'Tienes <b>' . $alerta_solicitudes_notas . '</b> solicitud' . ($alerta_solicitudes_notas > 1 ? 'es' : '') . ' de nota pendiente' . ($alerta_solicitudes_notas > 1 ? 's' : '') . '. <a href="' . SITIO_CARPETA . '/views/tables/solicitudes_notas" style="color:var(--cambio-colores)">Revisar solicitudes</a>', 4);
endif; ?>
<aside id="showdialog"></aside>
<article id="notificar_guardado"></article>
<!-- Ajax-->
<?php if (LOCALIZACION && $_SESSION['tipo_usuario'] == 'empleado'): ?>
<script>
    var _geoLatitud = '';
    var _geoLongitud = '';
    if ("geolocation" in navigator) {
        navigator.geolocation.getCurrentPosition(function(position) {
            _geoLatitud = String(position.coords.latitude);
            _geoLongitud = String(position.coords.longitude);
        }, function(err) {
            console.warn('Geolocalizacion no disponible:', err.message);
        }, { enableHighAccuracy: true, timeout: 10000, maximumAge: 60000 });
    }

    function obtenerUbicacion() {
        return new Promise(function(resolve) {
            if (_geoLatitud && _geoLongitud) {
                resolve({ latitud: _geoLatitud, longitud: _geoLongitud });
                return;
            }
            if ("geolocation" in navigator) {
                navigator.geolocation.getCurrentPosition(function(position) {
                    _geoLatitud = String(position.coords.latitude);
                    _geoLongitud = String(position.coords.longitude);
                    resolve({ latitud: _geoLatitud, longitud: _geoLongitud });
                }, function() {
                    resolve({ latitud: '', longitud: '' });
                }, { enableHighAccuracy: true, timeout: 5000, maximumAge: 60000 });
            } else {
                resolve({ latitud: '', longitud: '' });
            }
        });
    }
</script>
<?php endif; ?>
<script>
    window.onload = function () {
        cargar_ajax_table();
        <?= ($_SESSION['tipo_usuario'] != "empleado") ?
            "let nombres = document.getElementById('nombre');
            if (nombres) {
            nombres.addEventListener('change', function() {
                cargar_ajax_table();
            });
        }
            
        nombres.addEventListener('input', function() {
            clearTimeout(timeout);
            cargar_ajax_table();
            // Iniciar un temporizador de 5 segundos después de que el usuario deje de escribir
            timeout = setTimeout(function() {
                guardar_consulta();
            }, 5000);
        });" : ''
            ?>
        <?php if ($_SESSION['tipo_usuario'] == 'admin' && isset($_GET['bienvenida']) && get_config('pantalla_bienvenida')): ?>
            ajax('bienvenida', 'showdialog', '', ['cargar_dialog()']);
        <?php endif; ?>
        let fecha_ini = document.getElementById("fecha_ini");
        let fecha_fin = document.getElementById("fecha_fin");
        let filtro_motivo = document.getElementById("filtro_motivo");
        let borrar_filtros = document.getElementById("borrar_filtros");
        let timeout = null;


        fecha_ini.addEventListener("change", function () {
            guardar_consulta();
            cargar_ajax_table();
        });
        fecha_fin.addEventListener("change", function () {
            guardar_consulta();
            cargar_ajax_table();
        });
        filtro_motivo.addEventListener("change", function () {
            guardar_consulta();
            cargar_ajax_table();
        });
        borrar_filtros.addEventListener("click", function () {
            <?= ($_SESSION['tipo_usuario'] != "empleado") ? 'nombres.value = "";' : '' ?>

            let fechaActual = new Date();

            // Crea una nueva fecha con el primer día del año
            let primerDiaAño = new Date(fechaActual.getFullYear(), 0, 1);

            // Formatea la fecha en formato Y-m-d
            let formatoYMD = primerDiaAño.getFullYear() + '-' +
                ('0' + (primerDiaAño.getMonth() + 1)).slice(-2) + '-' +
                ('0' + primerDiaAño.getDate()).slice(-2);
            fecha_ini.value = formatoYMD;
            let ultimoDiaAño = new Date(fechaActual.getFullYear(), 11, 31);

            // Formatea la fecha en formato Y-m-d
            let formatoYMD2 = ultimoDiaAño.getFullYear() + '-' +
                ('0' + (ultimoDiaAño.getMonth() + 1)).slice(-2) + '-' +
                ('0' + ultimoDiaAño.getDate()).slice(-2);
            fecha_fin.value = formatoYMD2;
            filtro_motivo.value = "";
            guardar_consulta();
            cargar_ajax_table();
        });


        function guardar_consulta() {
            let nombre = document.getElementById('nombre');
            if (!nombre) {
                nombre = '';
            } else {
                nombre = nombre.value
            }
            let fecha_inicio = document.getElementById('fecha_ini');
            // Si la fecha no es válida (ej: mm/dd/yyyy incompleto), no guardar todavía
            if (fecha_inicio.value != "" && !fecha_inicio.checkValidity()) return;
            fecha_inicio = fecha_inicio.value;

            let fecha_fin = document.getElementById('fecha_fin');
            if (fecha_fin.value != "" && !fecha_fin.checkValidity()) return;
            fecha_fin = fecha_fin.value;

            let id_motivo = document.getElementById('filtro_motivo').value;
            ajax('guardar_filtro_busqueda', 'notificar_guardado', 'nombre=' + nombre + '&fecha_inicio=' + fecha_inicio + '&fecha_fin=' + fecha_fin + '&id_motivo=' + id_motivo, []);
        }
    }

    function cargar_ajax_table() {
        let nombre = document.getElementById('nombre')?.value?.trim() ?? '';
        <?= (SISTEMA_INSPECTOR && $_SESSION['tipo_usuario'] == 'empleado') ? 'nombre="' . $nombre_empleado . '";' : '' ?>
        poner_cargando();
        ajax('tables/table_registros', 'registros', 'nombre=' + nombre + '&fecha_ini=' + fecha_ini.value + '&fecha_fin=' + fecha_fin.value + '&id_motivo=' + filtro_motivo.value + '&offset=0'
            <?= (isset($_GET["id_seleccionado"])) ? '+"&id_seleccionado=' . filter_input(INPUT_GET, "id_seleccionado", FILTER_SANITIZE_NUMBER_INT) . '"' : ''; ?> <?= (SISTEMA_INSPECTOR && $_SESSION['tipo_usuario'] == 'inspector') ? '+ "&inspector"' : '' ?>, ['quitar_cargando()']);
    }

    function cargarMasRegistros(offset) {
        let nombre = document.getElementById('nombre')?.value?.trim() ?? '';
        <?= (SISTEMA_INSPECTOR && $_SESSION['tipo_usuario'] == 'empleado') ? 'nombre="' . $nombre_empleado . '";' : '' ?>

        // Quitar el botón de cargar más mientras se carga
        let btnCargarMas = document.getElementById('btn-cargar-mas');
        if (btnCargarMas) {
            btnCargarMas.parentElement.innerHTML = '<span class="cargando-inline">Cargando...</span>';
        }

        let xhr = new XMLHttpRequest();
        xhr.open('POST', '<?= SITIO_CARPETA ?>/app/ajax/tables/table_registros.php', true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        const csrfMeta = document.querySelector('meta[name="csrf-token"]');
        let csrfTokenParam = '';
        if (csrfMeta) {
            xhr.setRequestHeader('X-CSRF-Token', csrfMeta.content);
            csrfTokenParam = '&csrf_token=' + encodeURIComponent(csrfMeta.content);
        }
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                // Crear un elemento temporal para parsear la respuesta
                let tempDiv = document.createElement('div');
                tempDiv.innerHTML = xhr.responseText;

                // Obtener las filas del nuevo grid (sin la cabecera)
                let nuevoGrid = tempDiv.querySelector('.grid-registros');
                if (nuevoGrid) {
                    let nuevasFilas = nuevoGrid.querySelectorAll('.fila');
                    let gridExistente = document.querySelector('#registros .grid-registros');

                    if (gridExistente) {
                        // Añadir las filas nuevas
                        for (let i = 0; i < nuevasFilas.length; i++) {
                            gridExistente.appendChild(nuevasFilas[i].cloneNode(true));
                        }
                    }
                }

                // Eliminar el contenedor del botón anterior
                let cargandoInline = document.querySelector('.cargando-inline');
                if (cargandoInline) {
                    cargandoInline.parentElement.remove();
                }

                // Añadir el nuevo botón si existe
                let nuevoBoton = tempDiv.querySelector('#btn-cargar-mas');
                if (nuevoBoton) {
                    document.querySelector('#registros').appendChild(nuevoBoton.parentElement.cloneNode(true));
                }
            }
        };
        xhr.send('nombre=' + encodeURIComponent(nombre) + '&fecha_ini=' + fecha_ini.value + '&fecha_fin=' + fecha_fin.value + '&id_motivo=' + filtro_motivo.value + '&offset=' + offset <?= (SISTEMA_INSPECTOR && $_SESSION['tipo_usuario'] == 'inspector') ? "+ '&inspector'" : '' ?> + csrfTokenParam);
    }

    function eliminar_registro(id) {
        ajax('dialogs/dialog_delete_registro', 'showdialog', 'id=' + id, ['cargar_dialog()', 'cargar_eliminar("registro")']);
    }

    function modificar_registro(id) {
        ajax('dialogs/dialog_editar_registro', 'showdialog', 'id=' + id, ['cargar_dialog()', 'cargar_modificar()']);
    }

    function cargar_modificar() {
        let modificar = document.getElementById('editar-registro');
        modificar.addEventListener('click', () => {
            mandar_modificar_registro();
        });
    }

    function mandar_modificar_registro() {
        let id = document.getElementById("id").value;
        let hora1 = document.getElementById("hora1").value;
        let hora2 = document.getElementById("hora2").value;
        let hora3 = document.getElementById("hora3").value;
        let hora4 = document.getElementById("hora4").value;
        let hora5 = document.getElementById("hora5").value;
        let hora6 = document.getElementById("hora6").value;
        let hora7 = document.getElementById("hora7").value;
        let hora8 = document.getElementById("hora8").value;
        let hora9 = document.getElementById("hora9").value;
        let hora10 = document.getElementById("hora10").value;
        let id_motivo = document.getElementById("id_motivo").value;
        let data = 'id=' + id + '&hora1=' + hora1 + '&hora2=' + hora2 + '&hora3=' + hora3 + '&hora4=' + hora4 + '&hora5=' + hora5 + '&hora6=' + hora6 + '&hora7=' + hora7 + '&hora8=' + hora8 + '&hora9=' + hora9 + '&hora10=' + hora10 + '&id_motivo=' + id_motivo;
        <?php if ($_SESSION['tipo_usuario'] == 'admin' && PERMITIR_OCULTAR_APROBACIONES): ?>
            let ocultar = document.getElementById('no_mostrar_aprobaciones');
            if (ocultar && ocultar.checked) {
                data += '&no_mostrar_aprobaciones=true';
            }
        <?php endif; ?>

        ajax('forms/modificar_registro', 'notificaciones', data, ['cargar_ajax_table()']);
    }
    <?php if (get_config('notas')): ?>

        function llamar_nota(id_registro) {
            ajax('dialogs/dialog_nota', 'showdialog', 'id=' + id_registro, ['cargar_dialog()']);
        }

        function guardar_nota(id_registro) {
            let nota = document.getElementById('nota');
            ajax('forms/nota', 'notificaciones', 'id=' + id_registro + '&nota=' + nota.value, ['cargar_ajax_table()', 'animacion_y_cierre_dialog()']);
        }
    <?php endif; ?>

    <?php if ($_SESSION['tipo_usuario'] == "empleado"): ?>

        function llamar_dialog_fichar() {
            ajax('dialogs/dialog_fichar', 'showdialog', '', ['cargar_dialog()']);
        }

        <?php if (LOCALIZACION): ?>
        async function fichar(tipo = '') {
            let latitud = '';
            let longitud = '';
            if (typeof obtenerUbicacion === 'function') {
                let ubicacion = await obtenerUbicacion();
                latitud = ubicacion.latitud;
                longitud = ubicacion.longitud;
            }
            ajax('forms/fichar', 'notificaciones', 'pag_origen=fichajes&tipo_registro=' + tipo + '&latitud=' + latitud + '&longitud=' + longitud, ['cargar_ajax_table()', 'animacion_y_cierre_dialog()']);
        }
        <?php else: ?>
        function fichar(tipo = '') {
            ajax('forms/fichar', 'notificaciones', 'pag_origen=fichajes&tipo_registro=' + tipo, ['cargar_ajax_table()', 'animacion_y_cierre_dialog()']);
        }
        <?php endif; ?>

        // Funciones para notas de empleados
        function llamar_nota(id_registro) {
            ajax('dialogs/dialog_nota', 'showdialog', 'id=' + id_registro, ['cargar_dialog()']);
        }

        function solicitar_nota(id_registro) {
            let nota = document.getElementById('nota');
            if (!nota.value.trim()) {
                alert('Por favor, escribe una nota antes de enviar');
                return;
            }
            ajax('forms/solicitar_nota', 'notificaciones', 'id_registro=' + id_registro + '&nota=' + encodeURIComponent(nota.value), ['cargar_ajax_table()', 'animacion_y_cierre_dialog()']);
        }
    <?php endif; ?>

    <?php if ($_SESSION['tipo_usuario'] == 'admin' && isset($_GET['bienvenida'])): ?>

        function no_mostrar_mas() {
            ajax('forms/actualizar_configuracion', 'notificaciones', 'conf=pantalla_bienvenida&valor=0', ['animacion_y_cierre_dialog()'])
        }
    <?php endif; ?>
</script>
<!-- Ajax-->
<?php footer(true); ?>