<?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, "Horas acumuladas", true, true);
$es_empleado = $_SESSION['tipo_usuario'] == 'empleado';
$mostrar_apellidos = get_config('mostrar_apellidos_tabla');

// Obtener lista de empleados con horas acumuladas para el datalist
$empleados_lista = consulta("SELECT id, nombre, apellidos FROM empleados ORDER BY nombre;", [], true);

// Obtener grupos para el filtro
$grupos = consulta("SELECT id, nombre FROM grupos ORDER BY nombre;", [], true);
?>

<section class="cristal" <?= (!get_config_usuario($_SESSION['id_usuario'], 'reducir_efectos_movimiento')) ? 'style="view-transition-name: cristal;"' : '' ?>>
    <h1 class="resaltado textocentrado"><?= $es_empleado ? 'Mis horas acumuladas' : 'Horas acumuladas' ?></h1>
    <?php if ($_SESSION['tipo_usuario'] == 'admin'): ?>
        <section class="flex row supercentrado gap1">
            <a href="/views/tables/historial_horas_acumuladas" class="btn-s">Historial aplicaciones</a>
            <a href="/views/tables/historial_horas_acumuladas_cron" class="btn-s verde">Historial sistema</a>
        </section>
    <?php endif; ?>
    <?php
    if (!empty($empleados_check = consulta("SELECT id FROM empleados LIMIT 1;", [], true))):
    ?>
        <?php if (!$es_empleado): ?>
            <section class="flex row gap1 row-column" style="align-items:flex-end;flex-wrap:wrap;">
                <label class="flex column gap02"><b>Empleado</b>
                    <input type="search" id="buscador" list="lista_empleados"
                        placeholder="<?= $mostrar_apellidos ? 'Nombre o apellidos' : 'Buscar por nombre' ?>">
                    <datalist id="lista_empleados">
                        <?php foreach ($empleados_lista as $emp):
                            $nombre_completo = $mostrar_apellidos && !empty($emp['apellidos'])
                                ? $emp['nombre'] . ' ' . $emp['apellidos']
                                : $emp['nombre'];
                            ?>
                            <option value="<?= htmlspecialchars($nombre_completo) ?>">
                            <?php endforeach; ?>
                    </datalist>
                </label>
                <label class="flex column gap02"><b>Grupo</b>
                    <select id="filtro_grupo">
                        <option value="">Todos</option>
                        <?php if (!empty($grupos)): ?>
                            <?php foreach ($grupos as $g): ?>
                                <option value="<?= $g['id'] ?>"><?= htmlspecialchars($g['nombre']) ?></option>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </select>
                </label>
            </section>
            <?php if ($_SESSION['tipo_usuario'] == 'admin'): ?>
            <?php if (get_config('minutos_sin_conversion') === false): ?>
            <section class="flex row gap1 supercentrado" style="margin-top:0.5rem;padding:0.75rem;background:light-dark(#fff3cd,#4a3f1f);border-radius:0.5rem;border:1px solid light-dark(#ffc107,#7a6a2f);">
                <span>⚠️ Es necesario reconvertir los minutos de las horas acumuladas</span>
                <button type="button" class="btn-p" onclick="reconvertir_valores()">Reconvertir ahora</button>
            </section>
            <?php endif; ?>
            <section class="flex row gap1 row-column" style="align-items:flex-end;flex-wrap:wrap;margin-top:0.5rem;">
                <label class="flex column gap02"><b>Sumar/restar horas a todos</b>
                    <input type="number" id="bulk_horas" step="0.1" value="0" style="width:6rem;text-align:center;">
                </label>
                <button type="button" class="btn-s" onclick="rellenar_masivo()">Rellenar</button>
            </section>
            <?php endif; ?>
        <?php endif; ?>
        <section id="cargando"></section>
        <section id="acumulaciones"></section>
        <?php if ($_SESSION['tipo_usuario'] == 'admin'): ?>
            <section id="cont_aplicar_todo" style="display:none;margin-top:0.5rem;" class="flex row supercentrado">
                <button type="button" class="btn-p" onclick="aplicar_todo()">Aplicar todo</button>
            </section>
        <?php endif; ?>
    <?php else: ?>
        <article id="no-hay-datos" class="flex wrap" style="width:fit-content; text-wrap: balance; margin-top: 1rem;">
            <h3>¡Vaya, parece que no tienes empleados! <a class="enlace blanco" href="<?= SITIO_CARPETA ?>/views/forms/empleado">Añadir empleado</a></h3>
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em"><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"/></svg>
        </article>
    <?php endif; ?>
</section>
<aside id="showdialog"></aside>
<script>
    window.onload = function () {
        cargar_horas_Acumuladas();
        var buscador = document.getElementById("buscador");
        if (buscador) {
            buscador.addEventListener("keyup", function () {
                cargar_horas_Acumuladas();
            });
        }
        var filtroGrupo = document.getElementById("filtro_grupo");
        if (filtroGrupo) {
            filtroGrupo.addEventListener("change", function () {
                cargar_horas_Acumuladas();
            });
        }
    }

    function cargar_horas_Acumuladas() {
        poner_cargando();
        let params = [];
        var buscador = document.getElementById("buscador");
        if (buscador && buscador.value) {
            params.push('nombre=' + buscador.value);
        }
        var filtroGrupo = document.getElementById("filtro_grupo");
        if (filtroGrupo && filtroGrupo.value) {
            params.push('grupo=' + filtroGrupo.value);
        }
        let data = params.length > 0 ? params.join('&') : undefined;
        ajax('tables/table_horas_acumuladas', 'acumulaciones', data, ['quitar_cargando()', 'cargar_js_acum()']);
    }

    function cargar_js_acum() {
        let total = document.getElementById("total").value;
        for (let i = 0; i < total; i++) {
            let acumuladoInput = document.getElementById('acumulado' + i);
            let pagarInput = document.getElementById('pagar' + i);
            let acumuladototalInput = document.getElementById('acumuladototal' + i);
            //coger data-id
            let id = acumuladoInput.getAttribute('data-id');
            acumuladoInput.addEventListener('keyup', () => actualizarAcumuladoTotal(i));
            pagarInput.addEventListener('keyup', () => actualizarAcumuladoTotal(i));
            actualizarAcumuladoTotal(i);
        }
        let btnAplicarTodo = document.getElementById('cont_aplicar_todo');
        if (btnAplicarTodo) {
            btnAplicarTodo.style.display = parseInt(total) > 0 ? 'flex' : 'none';
        }
    }

    function actualizarAcumuladoTotal(i) {
        let acumuladoInput = document.getElementById('acumulado' + i);
        let pagarInput = document.getElementById('pagar' + i);
        let acumuladototal = document.getElementById('acumuladototal' + i);
        let acumulado = document.getElementById('acumulado' + i).value;
        let pagar = document.getElementById('pagar' + i).value;
        const resultado = (acumulado - pagar);

        if (resultado % 1 === 0) {
            acumuladototal.value = Math.floor(resultado);
        } else {
            acumuladototal.value = resultado.toFixed(2);
        }
    }

    function aplicar_horas(i, id) {
        //ajax aplicar cambios
        poner_cargando();
        let acumulado = document.getElementById('acumulado' + i);
        let pagar = document.getElementById('pagar' + i);
        let restante = document.getElementById('acumuladototal' + i);
        let nota = document.getElementById('nota' + i);
        ajax('forms/actualizar_horas_acumuladas', 'notificaciones', "id=" + id + "&acumulado=" + acumulado.value + "&pagar=" + pagar.value + "&restante=" + restante.value + '&nota=' + nota.value, ['cargar_horas_Acumuladas()', 'quitar_cargando()']);
    }

    function rellenar_masivo() {
        let bulkHoras = document.getElementById('bulk_horas');
        let horas = parseFloat(bulkHoras.value);
        if (isNaN(horas) || horas === 0) {
            alert('Introduce una cantidad de horas distinta de 0');
            return;
        }
        let total = parseInt(document.getElementById("total").value);
        if (total === 0) {
            alert('No hay empleados visibles');
            return;
        }
        for (let i = 0; i < total; i++) {
            let acum = document.getElementById('acumulado' + i);
            if (acum) {
                let actual = parseFloat(acum.value) || 0;
                let nuevo = actual + horas;
                acum.value = nuevo % 1 === 0 ? nuevo : nuevo.toFixed(2);
                actualizarAcumuladoTotal(i);
            }
        }
    }

    function aplicar_todo() {
        let total = parseInt(document.getElementById("total").value);
        if (total === 0) return;
        let html = '<dialog id="dialog" class="cristal" open>';
        html += '<h2>⏱️ Aplicar todo</h2>';
        html += '<section class="flex column gap05" style="width:100%;">';
        html += '<p>¿Aplicar los cambios a los <b>' + total + '</b> empleados visibles?</p>';
        html += '</section>';
        html += '<section class="flex row gap5 pa1">';
        html += '<button id="cancelar" class="btn-t" title="Cancelar">Cancelar</button>';
        html += '<button id="aceptar" class="btn-p" title="Aplicar" onclick="ejecutar_aplicar_todo()">Aplicar</button>';
        html += '</section>';
        html += '</dialog>';
        document.getElementById('showdialog').innerHTML = html;
        cargar_dialog();
    }

    function ejecutar_aplicar_todo() {
        animacion_y_cierre_dialog();
        let total = parseInt(document.getElementById("total").value);
        poner_cargando();
        for (let i = 0; i < total; i++) {
            let acum = document.getElementById('acumulado' + i);
            if (!acum) continue;
            let id = acum.getAttribute('data-id');
            let acumVal = acum.value;
            let pagar = document.getElementById('pagar' + i);
            let restante = document.getElementById('acumuladototal' + i);
            let nota = document.getElementById('nota' + i);
            let esUltimo = (i === total - 1);
            let callbacks = esUltimo ? ['cargar_horas_Acumuladas()', 'quitar_cargando()'] : [];
            ajax('forms/actualizar_horas_acumuladas', 'notificaciones',
                "id=" + id + "&acumulado=" + acumVal + "&pagar=" + pagar.value + "&restante=" + restante.value + '&nota=' + nota.value,
                callbacks);
        }
    }
    function reconvertir_valores() {
        let html = '<dialog id="dialog" class="cristal" open>';
        html += '<h2>🔄 Reconvertir valores</h2>';
        html += '<section class="flex column gap05" style="width:100%;">';
        html += '<p>¿Reconvertir <b>todos</b> los valores de horas acumuladas de formato decimal (5.75) a formato H.MM (5.45)?</p>';
        html += '</section>';
        html += '<section class="flex row gap5 pa1">';
        html += '<button id="cancelar" class="btn-t" title="Cancelar">Cancelar</button>';
        html += '<button id="aceptar" class="btn-p" title="Reconvertir" onclick="ejecutar_reconversion()">Reconvertir</button>';
        html += '</section>';
        html += '</dialog>';
        document.getElementById('showdialog').innerHTML = html;
        cargar_dialog();
    }

    function ejecutar_reconversion() {
        animacion_y_cierre_dialog();
        poner_cargando();
        ajax('forms/reconvertir_horas_acumuladas', 'notificaciones', '', ['quitar_cargando()', 'recargar_pagina()']);
    }

    function recargar_pagina() {
        location.reload();
    }
</script>

<?php footer(true); ?>