/**
 * Sistema de Auto-Logout por Inactividad
 * Configuración: 20 minutos de timeout en servidor
 * 
 * Flujo:
 * - 18 min: Muestra advertencia
 * - 19.5 min: Cierra sesión automáticamente
 * - 20 min: Timeout del servidor (ya cerrada en frontend)
 */

(function () {
    'use strict';

    // ============================================
    // CONFIGURACIÓN
    // ============================================
    const CONFIG = {
        SESSION_TIMEOUT: 20 * 60 * 1000,      // 20 minutos en milisegundos
        WARNING_TIME: 18 * 60 * 1000,         // 18 minutos - mostrar advertencia
        LOGOUT_TIME: 19.5 * 60 * 1000,        // 19.5 minutos - cerrar sesión
        CHECK_INTERVAL: 1000                   // Verificar cada segundo
    };

    // ============================================
    // VARIABLES
    // ============================================
    let lastActivity = Date.now();
    let warningShown = false;
    let checkInterval = null;
    let warningModal = null;
    let countdownInterval = null;

    // ============================================
    // FUNCIONES
    // ============================================

    /**
     * Actualiza el tiempo de última actividad
     */
    function updateActivity() {
        lastActivity = Date.now();
        warningShown = false;

        // Cerrar modal si está abierto
        if (warningModal) {
            const modalInstance = bootstrap.Modal.getInstance(warningModal);
            if (modalInstance) {
                modalInstance.hide();
            }
        }
    }

    /**
     * Muestra modal de advertencia
     */
    function showWarning() {
        if (warningShown) return;
        warningShown = true;

        const timeLeft = Math.ceil((CONFIG.LOGOUT_TIME - (Date.now() - lastActivity)) / 1000);

        // Crear modal si no existe
        if (!warningModal) {
            createWarningModal();
        }

        // Mostrar modal
        const modalInstance = new bootstrap.Modal(warningModal);
        modalInstance.show();

        // Iniciar cuenta regresiva
        startCountdown(timeLeft);
    }

    /**
     * Crea el modal de advertencia
     */
    function createWarningModal() {
        const modalHTML = `
            <div class="modal fade" id="sessionWarningModal" tabindex="-1" data-bs-backdrop="static" data-bs-keyboard="false">
                <div class="modal-dialog modal-dialog-centered">
                    <div class="modal-content">
                        <div class="modal-header bg-warning text-dark">
                            <h5 class="modal-title">
                                <i class="bi bi-exclamation-triangle me-2"></i>
                                Sesión por Expirar
                            </h5>
                        </div>
                        <div class="modal-body text-center">
                            <p class="mb-3">Tu sesión expirará por inactividad en:</p>
                            <h2 class="text-warning mb-3">
                                <i class="bi bi-clock"></i>
                                <span id="sessionCountdown">--</span>
                            </h2>
                            <p class="text-muted small">
                                Haz clic en "Continuar" para mantener tu sesión activa.
                            </p>
                        </div>
                        <div class="modal-footer justify-content-center">
                            <button type="button" class="btn btn-primary" id="btnContinueSession">
                                <i class="bi bi-check-circle me-2"></i>
                                Continuar Trabajando
                            </button>
                        </div>
                    </div>
                </div>
            </div>
        `;

        document.body.insertAdjacentHTML('beforeend', modalHTML);
        warningModal = document.getElementById('sessionWarningModal');

        // Event listener para botón continuar
        document.getElementById('btnContinueSession').addEventListener('click', function () {
            updateActivity();
            const modalInstance = bootstrap.Modal.getInstance(warningModal);
            modalInstance.hide();
        });
    }

    /**
     * Inicia cuenta regresiva en el modal
     */
    function startCountdown(seconds) {
        const countdownElement = document.getElementById('sessionCountdown');

        // Limpiar intervalo anterior si existe
        if (countdownInterval) {
            clearInterval(countdownInterval);
        }

        function updateCountdown() {
            const timeLeft = Math.ceil((CONFIG.LOGOUT_TIME - (Date.now() - lastActivity)) / 1000);

            if (timeLeft <= 0) {
                clearInterval(countdownInterval);
                logout();
                return;
            }

            const minutes = Math.floor(timeLeft / 60);
            const secs = timeLeft % 60;
            countdownElement.textContent = `${minutes}:${secs.toString().padStart(2, '0')}`;
        }

        updateCountdown();
        countdownInterval = setInterval(updateCountdown, 1000);
    }

    /**
     * Cierra la sesión y redirige al login
     */
    function logout() {
        // Limpiar intervalos
        if (checkInterval) clearInterval(checkInterval);
        if (countdownInterval) clearInterval(countdownInterval);

        // Cerrar modal si está abierto
        if (warningModal) {
            const modalInstance = bootstrap.Modal.getInstance(warningModal);
            if (modalInstance) {
                modalInstance.hide();
            }
        }

        // Llamar al endpoint de logout
        fetch('../src/logout.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            }
        }).finally(() => {
            // Redirigir al login con mensaje
            window.location.href = '../views/login.php?error=' + encodeURIComponent('Sesión cerrada por inactividad');
        });
    }

    /**
     * Verifica el tiempo de inactividad
     */
    function checkInactivity() {
        const inactiveTime = Date.now() - lastActivity;

        // Si alcanzó el tiempo de logout, cerrar sesión
        if (inactiveTime >= CONFIG.LOGOUT_TIME) {
            logout();
            return;
        }

        // Si alcanzó el tiempo de advertencia, mostrar modal
        if (inactiveTime >= CONFIG.WARNING_TIME && !warningShown) {
            showWarning();
        }
    }

    /**
     * Inicializa el sistema de timeout
     */
    function init() {
        // Eventos que resetean el contador de inactividad
        const events = ['mousedown', 'mousemove', 'keypress', 'scroll', 'touchstart', 'click'];

        events.forEach(event => {
            document.addEventListener(event, updateActivity, true);
        });

        // Iniciar verificación periódica
        checkInterval = setInterval(checkInactivity, CONFIG.CHECK_INTERVAL);

        console.log('✓ Sistema de auto-logout iniciado (timeout: 20 minutos)');
    }

    // ============================================
    // INICIALIZACIÓN
    // ============================================

    // Iniciar cuando el DOM esté listo
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

})();
