// --- 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();
}

// --- GENERAR RANKING HTML ---
function generateRankingHTML(regionCount) {
    // Sort parties by votes
    const sortedParties = Object.entries(partidos)
        .sort((a, b) => b[1].votos - a[1].votos);

    let rankingHTML = '<div class="overlay-ranking"><strong>Ranking Final:</strong><br>';
    sortedParties.forEach(([key, party], index) => {
        const position = index + 1;
        const votos = party.votos >= 1000000
            ? (party.votos / 1000000).toFixed(1) + 'M'
            : Math.floor(party.votos).toLocaleString();
        const regions = regionCount[key] || 0;
        const isPlayer = party.isPlayer ? ' (Tú)' : '';
        const highlight = party.isPlayer ? ' style="color: #ffcc00;"' : '';
        rankingHTML += `<span${highlight}>${position}. ${party.emoji} ${party.name}${isPlayer} - ${votos} votos (${regions} CC.AA.)</span><br>`;
    });
    rankingHTML += '</div>';
    return rankingHTML;
}

// --- VERIFICAR VICTORIA/DERROTA ---
function checkGameEnd() {
    if (gameState.gameOver) return;

    // Obtener umbral de victoria (puede ser modificado por privilegios)
    const victoryThreshold = typeof getVictoryThreshold === 'function'
        ? getVictoryThreshold()
        : VICTORIA_VOTOS;

    for (let key in partidos) {
        const partido = partidos[key];
        if (partido.votos >= victoryThreshold) {
            gameState.gameOver = true;

            // Count regions
            const regionCount = {};
            for (let k in partidos) { regionCount[k] = 0; }
            for (let regionId in regiones) {
                const ctrl = regiones[regionId].controlador;
                if (ctrl) regionCount[ctrl]++;
            }

            // Generate ranking HTML
            const rankingHTML = generateRankingHTML(regionCount);

            if (partido.isPlayer) {
                // Victory!
                audioSystem.playUnlock();
                const thresholdStr = victoryThreshold >= 1000000
                    ? (victoryThreshold / 1000000).toFixed(0) + 'M'
                    : victoryThreshold.toLocaleString();

                // Calcular Casta que se ganará
                const castaPreview = typeof calcularCastaPreview === 'function'
                    ? calcularCastaPreview()
                    : 0;

                const playerParty = partidos[partidoElegido];
                const kofiCTA = `
                    <div class="victory-kofi">
                        <p>¿Te ha gustado? Ayuda al desarrollo</p>
                        <a href="https://ko-fi.com/jfrmorales" target="_blank" class="btn btn--kofi-victory">
                            ☕ Invítame a un café
                        </a>
                    </div>
                `;
                const stats = `
                    ${playerParty.emoji} ${playerParty.name} ha llegado a ${thresholdStr} votos<br><br>
                    Votos totales: ${Math.floor(partido.votos).toLocaleString()}<br>
                    Comunidades controladas: ${regionCount[partidoElegido]} / 17<br>
                    ${gameState.ascensionCount > 0 ? `⚜️ Casta disponible: ${getCastaDisponible()}` : `Ego Político acumulado: ${gameState.egoPolitico}`}<br>
                    <span style="color: #d4af37; font-weight: bold;">⚜️ Casta a ganar: +${castaPreview}</span><br><br>
                    ${rankingHTML}
                    ${kofiCTA}
                `;
                document.getElementById('victory-stats').innerHTML = stats;
                const victoryOverlay = document.getElementById('victory-overlay');
                victoryOverlay.style.display = 'flex';
                setupFocusTrap(victoryOverlay, () => {
                    victoryOverlay.style.display = 'none';
                    removeFocusTrap(victoryOverlay);
                });

                // Añadir botones de victoria si no existen
                const buttonsContainer = victoryOverlay.querySelector('.overlay-buttons') ||
                    victoryOverlay.querySelector('button').parentElement;

                // Botón Gobernar España (nuevo)
                if (!document.getElementById('govern-btn-victory') && buttonsContainer) {
                    const governBtn = document.createElement('button');
                    governBtn.id = 'govern-btn-victory';
                    governBtn.className = 'btn btn--lg govern-btn';
                    governBtn.innerHTML = '🏛️ Gobernar España';
                    governBtn.onclick = enterGovernmentPhase;
                    buttonsContainer.insertBefore(governBtn, buttonsContainer.firstChild);
                }

                // Botón Ascender
                if (!document.getElementById('ascend-btn-victory') && buttonsContainer) {
                    const ascendBtn = document.createElement('button');
                    ascendBtn.id = 'ascend-btn-victory';
                    ascendBtn.className = 'btn btn--lg btn--3d btn--gold ascend-btn';
                    ascendBtn.innerHTML = '🐙 Ascender al Estado Profundo';
                    ascendBtn.onclick = ascender;
                    buttonsContainer.insertBefore(ascendBtn, buttonsContainer.firstChild);
                }
            } else {
                // Defeat
                const playerParty = partidos[partidoElegido];

                // Obtener mensaje de Ko-fi para derrota
                const kofiMessage = typeof getRandomAnuncio === 'function'
                    ? getRandomAnuncio('derrota')
                    : 'Has perdido, pero puedes ganar mi gratitud';

                const kofiCTA = `
                    <div class="defeat-kofi">
                        <p>"${kofiMessage}"</p>
                        <a href="https://ko-fi.com/jfrmorales" target="_blank" class="btn btn--kofi-defeat">
                            ☕ Ahogar las penas en café
                        </a>
                    </div>
                `;

                const stats = `
                    ${partido.emoji} ${partido.name} ha llegado a ${victoryThreshold >= 1000000 ? (victoryThreshold / 1000000).toFixed(0) + 'M' : victoryThreshold.toLocaleString()} votos<br><br>
                    Tus votos (${playerParty.name}): ${Math.floor(playerParty.votos).toLocaleString()}<br>
                    Sus votos: ${Math.floor(partido.votos).toLocaleString()}<br>
                    Comunidades que controlabas: ${regionCount[partidoElegido]} / 17<br><br>
                    ${rankingHTML}
                    ${kofiCTA}
                `;
                document.getElementById('defeat-stats').innerHTML = stats;
                const defeatOverlay = document.getElementById('defeat-overlay');
                defeatOverlay.style.display = 'flex';
                setupFocusTrap(defeatOverlay, () => {
                    defeatOverlay.style.display = 'none';
                    removeFocusTrap(defeatOverlay);
                });
                audioSystem.playError();
            }

            if (typeof enviarPuntuacionAlRanking === 'function') {
                const playerVotos = (partidos[partidoElegido] && partidos[partidoElegido].votos) || 0;
                enviarPuntuacionAlRanking(playerVotos);
            }
            return;
        }
    }
}

// --- REINICIAR JUEGO (conservando ascensiones) ---
function restartGame() {
    // Resetear toast de donación
    if (typeof DonationToast !== 'undefined') {
        DonationToast.reset();
    }

    // PRESERVAR campos de ascensión antes del reset
    const preservar = {
        castaAcumulada: gameState.castaAcumulada || 0,
        castaGastada: gameState.castaGastada || 0,
        ascensionCount: gameState.ascensionCount || 0,
        privilegiosComprados: gameState.privilegiosComprados ? [...gameState.privilegiosComprados] : []
    };

    // Reinicializar TODO usando la función centralizada (que ahora limpia a fondo)
    initGameState();

    // Reset all parties usando la función centralizada
    resetPartidos(partidoElegido);

    // Reset regions
    for (let key in regiones) {
        regiones[key].controlador = null;
        regiones[key].votosPartidos = {};
    }

    // Reset logros
    for (let key in logros) {
        logros[key].unlocked = false;
    }

    // Reset eventos
    initEventos();
    if (typeof initEventosIncontrolables === 'function') initEventosIncontrolables();
    currentHeadlineIndex = 0;

    // Hide overlays
    document.getElementById('victory-overlay').style.display = 'none';
    document.getElementById('defeat-overlay').style.display = 'none';
    document.getElementById('prestige-container').style.display = 'none';

    // RESTAURAR campos de ascensión
    gameState.castaAcumulada = preservar.castaAcumulada;
    gameState.castaGastada = preservar.castaGastada;
    gameState.ascensionCount = preservar.ascensionCount;
    gameState.privilegiosComprados = preservar.privilegiosComprados;

    // Mostrar mensaje apropiado según si tiene ascensiones o no
    if (preservar.ascensionCount > 0) {
        const castaDisponible = preservar.castaAcumulada - preservar.castaGastada;
        document.getElementById('ego-display').innerText = `⚜️ Casta: ${castaDisponible} | Ascensiones: ${preservar.ascensionCount}`;
    } else {
        document.getElementById('ego-display').innerText = 'Ego Político: 0 (Bonus: +0%)';
    }

    renderShop();
    calculateVPS();
    updateDisplay();
    renderLogros();
    if (typeof updateDeficitBar === 'function') updateDeficitBar();

    // Guardar el estado (con ascensiones preservadas)
    saveGame();
}

// --- RESET PROGRESISTA (segunda oportunidad al perder) ---
function resetProgresista() {
    audioSystem.playBuy();

    // Resetear toast de donación
    if (typeof DonationToast !== 'undefined') {
        DonationToast.reset();
    }

    // PRESERVAR contadores de Reset Progresista y Meta-progresión
    const preservar = {
        count: gameState.resetProgresistaCount + 1,
        reduction: gameState.aiDifficultyReduction + 0.1,
        // Ascensiones
        castaAcumulada: gameState.castaAcumulada || 0,
        castaGastada: gameState.castaGastada || 0,
        ascensionCount: gameState.ascensionCount || 0,
        privilegiosComprados: gameState.privilegiosComprados ? [...gameState.privilegiosComprados] : []
    };

    // Reinicializar TODO usando la función centralizada
    initGameState();

    // Restaurar meta-progresión
    gameState.resetProgresistaCount = preservar.count;
    gameState.aiDifficultyReduction = preservar.reduction;
    gameState.castaAcumulada = preservar.castaAcumulada;
    gameState.castaGastada = preservar.castaGastada;
    gameState.ascensionCount = preservar.ascensionCount;
    gameState.privilegiosComprados = preservar.privilegiosComprados;

    // Reset all parties con reducción de dificultad para IA
    resetPartidos(partidoElegido);

    // Reset regions
    for (let key in regiones) {
        regiones[key].controlador = null;
        regiones[key].votosPartidos = {};
    }

    // Los logros se mantienen desbloqueados (no se vuelven a dar premios)

    // Reset eventos
    initEventos();
    if (typeof initEventosIncontrolables === 'function') initEventosIncontrolables();
    currentHeadlineIndex = 0;

    // Hide overlays
    document.getElementById('victory-overlay').style.display = 'none';
    document.getElementById('defeat-overlay').style.display = 'none';
    document.getElementById('prestige-container').style.display = 'none';

    // Mostrar bonificación actual
    const vpsBonus = gameState.resetProgresistaCount * 10;
    const aiPenalty = Math.round(gameState.aiDifficultyReduction * 100);
    document.getElementById('ego-display').innerText = `Reset Progresista x${gameState.resetProgresistaCount} (+${vpsBonus}% VPS, rivales -${aiPenalty}%)`;

    // Guardar inmediatamente para preservar el estado
    saveGame();

    renderShop();
    calculateVPS();
    updateDisplay();
    renderLogros();
    if (typeof updateDeficitBar === 'function') updateDeficitBar();
}

// --- MODAL DE NUEVA PARTIDA ---
function openNewGameModal() {
    audioSystem.playClick();
    const modal = document.getElementById('new-game-modal');
    modal.classList.add('active');
    setupFocusTrap(modal, closeNewGameModal);
}

function closeNewGameModal() {
    audioSystem.playClick();
    const modal = document.getElementById('new-game-modal');
    modal.classList.remove('active');
    removeFocusTrap(modal);
}

// Nueva partida conservando ascensiones
function confirmNewGame() {
    closeNewGameModal();
    mostrarConfirmacion(
        '¿Seguro que quieres empezar una nueva partida? Se perderá el progreso actual.',
        () => {
            // Cerrar panel de ascensión si está abierto
            const ascensionPanel = document.getElementById('ascension-panel');
            if (ascensionPanel && ascensionPanel.classList.contains('visible')) {
                ascensionPanel.classList.remove('visible');
            }
            showPartySelectorForNewGame();
        }
    );
}

// Borrado completo de datos
async function confirmDeleteAll() {
    closeNewGameModal();
    isWipingData = true; // Evitar que cualquier saveGame() guarde

    // Borrar de localStorage
    localStorage.removeItem(SAVE_KEY);

    // Borrar de Capacitor Preferences si está disponible
    if (typeof clearPreferences === 'function') {
        await clearPreferences();
    }

    location.reload();
}

// --- TOGGLE MODAL DE AYUDA ---
function toggleHelp() {
    audioSystem.playClick();
    const modal = document.getElementById('help-modal');
    const isOpening = !modal.classList.contains('active');
    
    if (isOpening) {
        modal.classList.add('active');
        setupFocusTrap(modal, toggleHelp);
    } else {
        modal.classList.remove('active');
        removeFocusTrap(modal);
    }
}

// --- MODAL DE CONFIRMACIÓN ESTILIZADO ---
// Variable para almacenar la acción a ejecutar
let accionConfirmada = null;

// Mostrar modal de confirmación
function mostrarConfirmacion(mensaje, accion) {
    const modal = document.getElementById('confirm-modal');
    const messageEl = document.getElementById('confirm-message');
    if (modal && messageEl) {
        messageEl.textContent = mensaje;
        accionConfirmada = accion;
        modal.classList.add('active');
        audioSystem.playClick();
        setupFocusTrap(modal, cerrarConfirmacion);
    }
}

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

// Ejecutar la acción confirmada
function ejecutarConfirmacion() {
    const accion = accionConfirmada;
    cerrarConfirmacion();
    if (accion) {
        accion();
    }
}

// Confirmar nueva partida (usa el modal estilizado)
function confirmarNuevaPartida() {
    mostrarConfirmacion(
        '¿Seguro que quieres empezar una nueva partida? Se perderá el progreso actual.',
        () => {
            // Si el juego está pausado, reanudarlo
            if (window.isGamePaused) {
                togglePause();
            }
            restartGame();
        }
    );
}
