// Boomermania - UI Overlays (Pantallas de fin de juego)

// --- FOCUS TRAP SYSTEM (WCAG) ---
let lastFocusedElement = null;
let activeModal = null;

// Guardar referencia al elemento con foco antes de abrir modal
function saveFocus() {
    lastFocusedElement = document.activeElement;
}

// Restaurar foco al elemento guardado
function restoreFocus() {
    if (lastFocusedElement) {
        lastFocusedElement.focus();
        lastFocusedElement = null;
    }
}

// Obtener elementos enfocables dentro de un contenedor
function getFocusableElements(container) {
    const focusableSelectors = [
        'button:not([disabled])',
        'a[href]:not([disabled])',
        'input:not([disabled])',
        'select:not([disabled])',
        'textarea:not([disabled])',
        '[tabindex]:not([tabindex="-1"]):not([disabled])',
        '[contenteditable]:not([disabled])'
    ];
    return Array.from(container.querySelectorAll(focusableSelectors.join(',')));
}

// Enfocar el primer elemento enfocable de un contenedor
function focusFirstElement(container) {
    const focusable = getFocusableElements(container);
    if (focusable.length > 0) {
        focusable[0].focus();
    }
}

// Manejar tecla Tab para atrapar foco
function handleTabKey(e, modal) {
    const focusable = getFocusableElements(modal);
    if (focusable.length === 0) return;

    const firstFocusable = focusable[0];
    const lastFocusable = focusable[focusable.length - 1];

    if (e.shiftKey) {
        // Shift+Tab: si estamos en el primer elemento, ir al último
        if (document.activeElement === firstFocusable) {
            e.preventDefault();
            lastFocusable.focus();
        }
    } else {
        // Tab: si estamos en el último elemento, ir al primero
        if (document.activeElement === lastFocusable) {
            e.preventDefault();
            firstFocusable.focus();
        }
    }
}

// Configurar focus trap para un modal
function setupFocusTrap(modal, closeCallback) {
    activeModal = modal;

    // Manejar teclas
    const keyHandler = (e) => {
        if (e.key === 'Escape') {
            e.preventDefault();
            closeCallback();
        } else if (e.key === 'Tab') {
            handleTabKey(e, modal);
        }
    };

    modal.addEventListener('keydown', keyHandler);
    modal._focusTrapHandler = keyHandler;

    // Guardar foco y mover al primer elemento
    saveFocus();
    focusFirstElement(modal);
}

// Limpiar focus trap
function removeFocusTrap(modal) {
    if (modal._focusTrapHandler) {
        modal.removeEventListener('keydown', modal._focusTrapHandler);
        delete modal._focusTrapHandler;
    }
    activeModal = null;
    restoreFocus();
}

// --- SCREEN READER ANNOUNCEMENTS ---
let srAnnouncements, srEvents, srAchievements;

// Inicializar referencias a las regiones aria-live
function initAriaLiveRefs() {
    srAnnouncements = document.getElementById('sr-announcements');
    srEvents = document.getElementById('sr-events');
    srAchievements = document.getElementById('sr-achievements');
}

// Anunciar mensaje general (guardado, cambios significativos)
function announceToSR(message, type = 'polite') {
    const region = type === 'assertive' ? srEvents : srAnnouncements;
    if (!region) return;
    
    // Pequeño delay para evitar que lectores de pantalla ignoren cambios rápidos
    setTimeout(() => {
        region.textContent = message;
        // Limpiar después de un tiempo para que el mismo mensaje pueda ser anunciado de nuevo
        setTimeout(() => {
            if (region.textContent === message) {
                region.textContent = '';
            }
        }, 3000);
    }, 100);
}

// Anunciar logros desbloqueados
function announceAchievement(achievementName) {
    if (!srAchievements) return;
    
    setTimeout(() => {
        srAchievements.textContent = `🏆 Logro desbloqueado: ${achievementName}`;
        setTimeout(() => {
            srAchievements.textContent = '';
        }, 5000);
    }, 100);
}

// Anunciar eventos del juego
function announceEvent(eventTitle, eventDescription) {
    if (!srEvents) return;
    
    setTimeout(() => {
        srEvents.textContent = `📢 Evento: ${eventTitle}. ${eventDescription || ''}`;
        setTimeout(() => {
            srEvents.textContent = '';
        }, 6000);
    }, 100);
}

// Mostrar pantalla de fin de juego
function mostrarFinJuego() {
    const modal = document.getElementById('endgame-modal');
    const statsEl = document.getElementById('endgame-stats');
    const scoreEl = document.getElementById('final-score');
    const ratingEl = document.getElementById('endgame-rating');

    if (!modal || !gameState) return;

    // Calcular puntuación final
    calcularPuntuacion();

    // Obtener rating
    const rating = getRating(gameState.puntuacionTotal);

    // Renderizar estadísticas
    const resumen = getResumenGeneraciones();

    let statsHTML = `
        <div class="endgame-section">
            <h4>TU LEGADO</h4>
            <div class="stat-row">
                <span class="stat-label">🏠 Pisos acumulados:</span>
                <span class="stat-value positive">${gameState.playerResources.vivienda}</span>
            </div>
            <div class="stat-row">
                <span class="stat-label">💼 Nivel de empleo:</span>
                <span class="stat-value positive">${getTextoRecurso('empleo')}</span>
            </div>
            <div class="stat-row">
                <span class="stat-label">🏦 Pensión asegurada:</span>
                <span class="stat-value positive">${gameState.playerResources.pension}%</span>
            </div>
            <div class="stat-row">
                <span class="stat-label">📈 Bienestar personal:</span>
                <span class="stat-value positive">${gameState.puntuacionBienestar} pts</span>
            </div>
        </div>

        <div class="endgame-section">
            <h4>LO QUE DEJASTE</h4>
    `;

    // Mostrar estado de cada generación
    for (const [genId, data] of Object.entries(resumen)) {
        statsHTML += `
            <div class="generation-result">
                <span class="gen-emoji">${data.emoji}</span>
                <span class="gen-name">${data.nombre}</span>
                <span class="gen-desc">${data.descripcion}</span>
            </div>
        `;
    }

    statsHTML += `
            <div class="stat-row">
                <span class="stat-label">Índice de destrucción:</span>
                <span class="stat-value negative">${getIndiceDestruccion()}%</span>
            </div>
        </div>
    `;

    statsEl.innerHTML = statsHTML;

    // Puntuación final
    scoreEl.textContent = gameState.puntuacionTotal.toLocaleString();

    // Rating
    ratingEl.innerHTML = `
        <div class="rating-title">${rating.title}</div>
        <div class="rating-desc">${rating.description}</div>
        <div class="rating-quote">"${getFraseFinal(gameState.puntuacionTotal)}"</div>
    `;

    // Añadir sección Ko-fi si no existe
    let kofiSection = modal.querySelector('.endgame-kofi');
    if (!kofiSection) {
        kofiSection = document.createElement('div');
        kofiSection.className = 'endgame-kofi';
        const endgameButtons = modal.querySelector('.endgame-buttons');
        if (endgameButtons) {
            endgameButtons.parentNode.insertBefore(kofiSection, endgameButtons);
        }
    }

    // Obtener mensaje satírico
    const mensajeKofi = typeof getRandomAnuncio === 'function'
        ? getRandomAnuncio('finJuego')
        : '¿Te ha gustado acaparar recursos?';

    kofiSection.innerHTML = `
        <p>${mensajeKofi}</p>
        <a href="https://ko-fi.com/jfrmorales" target="_blank" class="btn--kofi-endgame">
            ☕ Invítame a un café
        </a>
    `;

    // Mostrar modal con focus trap
    modal.classList.add('active');
    setupFocusTrap(modal, () => {
        modal.classList.remove('active');
        removeFocusTrap(modal);
    });

    if (typeof audioSystem !== 'undefined') audioSystem.playWin();

    // Borrar guardado (juego terminado)
    deleteSave();

    if (typeof enviarPuntuacionAlRanking === 'function') {
        enviarPuntuacionAlRanking(gameState.puntuacionTotal);
    }
}

// Obtener rating según puntuación
function getRating(score) {
    // RATINGS está definido en constants.js, ordenado de menor a mayor
    let rating = RATINGS[0];

    for (const r of RATINGS) {
        if (score >= r.minScore) {
            rating = r;
        }
    }

    return rating;
}

// Reiniciar juego
function restartGame() {
    // Detener auto-guardado
    stopAutoSave();

    // Borrar partida guardada
    deleteSave();

    // Cerrar modales
    cerrarTodosModales();

    // Reiniciar estado
    initGameState();

    // Mostrar pantalla de inicio
    showStartScreen();

    // Renderizar selección de personaje
    renderizarSeleccionPersonaje();

    // Actualizar estadísticas de inicio
    actualizarEstadisticasInicio();

    // Resetear sistema de donaciones
    if (typeof DonationToast !== 'undefined') {
        DonationToast.reset();
    }
}

// Cerrar todos los modales
function cerrarTodosModales() {
    const modals = document.querySelectorAll('.modal');
    modals.forEach(modal => modal.classList.remove('active'));

    const panels = document.querySelectorAll('.panel');
    panels.forEach(panel => panel.classList.remove('active'));
}

// Mostrar pantalla de inicio
function showStartScreen() {
    const startScreen = document.getElementById('start-screen');
    const gameContainer = document.getElementById('game-container');

    if (startScreen) {
        startScreen.style.opacity = '1';
        startScreen.style.display = 'flex';
    }
    if (gameContainer) gameContainer.style.display = 'none';
}

// Ocultar pantalla de inicio
function hideStartScreen() {
    const startScreen = document.getElementById('start-screen');
    const gameContainer = document.getElementById('game-container');

    if (startScreen) {
        startScreen.style.opacity = '0';
        setTimeout(() => {
            startScreen.style.display = 'none';
        }, 500);
    }
    if (gameContainer) gameContainer.style.display = 'block';
}

// Mostrar menú de pausa
function mostrarMenuPausa() {
    const modal = document.getElementById('pause-modal');
    const soundBtn = document.getElementById('sound-toggle-btn');
    if (soundBtn && typeof audioSystem !== 'undefined') {
        soundBtn.textContent = audioSystem.muted ? '🔇' : '🔊';
    }
    if (modal) {
        modal.classList.add('active');
        setupFocusTrap(modal, cerrarPausa);
    }
}

// Alternar sonido (toggle desde menú de pausa)
function toggleSonido() {
    if (typeof audioSystem === 'undefined') return;
    const nowMuted = audioSystem.toggleMute();
    const soundBtn = document.getElementById('sound-toggle-btn');
    if (soundBtn) soundBtn.textContent = nowMuted ? '🔇' : '🔊';

    // Persistir en metaprogresión
    if (typeof cargarMetaprogresion === 'function' && typeof guardarMetaprogresionData === 'function') {
        const meta = cargarMetaprogresion();
        if (!meta.preferencias) meta.preferencias = {};
        meta.preferencias.sonido = !nowMuted;
        guardarMetaprogresionData(meta);
    }
    if (!nowMuted) audioSystem.playClick();
}

// Cerrar menú de pausa
function cerrarPausa() {
    const modal = document.getElementById('pause-modal');
    if (modal) {
        modal.classList.remove('active');
        removeFocusTrap(modal);
    }
}

// Mostrar ayuda
function mostrarAyuda() {
    const modal = document.getElementById('help-modal');
    if (modal) {
        modal.classList.add('active');
        setupFocusTrap(modal, cerrarAyuda);
    }
}

// Cerrar ayuda
function cerrarAyuda() {
    const modal = document.getElementById('help-modal');
    if (modal) {
        modal.classList.remove('active');
        removeFocusTrap(modal);
    }
}

// Confirmar nueva partida - mostrar modal personalizado
function confirmarNuevaPartida() {
    mostrarModalConfirmacion(
        '¿Seguro que quieres empezar una nueva partida? Se perderá el progreso actual.',
        () => {
            cerrarModalConfirmacion();
            cerrarPausa();
            restartGame();
        }
    );
}

// Mostrar modal de confirmación genérico
function mostrarModalConfirmacion(mensaje, onConfirm) {
    const modal = document.getElementById('confirm-modal');
    const messageEl = document.getElementById('confirm-message');
    const yesBtn = document.getElementById('confirm-yes');
    const noBtn = document.getElementById('confirm-no');

    if (!modal) return;

    messageEl.textContent = mensaje;

    // Limpiar listeners anteriores clonando los botones
    const newYesBtn = yesBtn.cloneNode(true);
    const newNoBtn = noBtn.cloneNode(true);
    yesBtn.parentNode.replaceChild(newYesBtn, yesBtn);
    noBtn.parentNode.replaceChild(newNoBtn, noBtn);

    // Añadir nuevos listeners
    newYesBtn.addEventListener('click', onConfirm);
    newNoBtn.addEventListener('click', cerrarModalConfirmacion);

    modal.classList.add('active');
    setupFocusTrap(modal, cerrarModalConfirmacion);
}

// Cerrar modal de confirmación
function cerrarModalConfirmacion() {
    const modal = document.getElementById('confirm-modal');
    if (modal) {
        modal.classList.remove('active');
        removeFocusTrap(modal);
    }
}

// Inicializar referencias aria-live cuando el DOM esté listo
if (typeof document !== 'undefined') {
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initAriaLiveRefs);
    } else {
        initAriaLiveRefs();
    }
}
