// --- SISTEMA DE EVENTOS ALEATORIOS ---
let eventosPendientes = [];
let tiempoParaEvento = 120000 + Math.random() * 180000; // 2-5 minutos
let tiempoTranscurrido = 0;
let eventoActual = null;

function initEventos() {
    eventosPendientes = [...eventos];
    tiempoParaEvento = 120000 + Math.random() * 180000;
    tiempoTranscurrido = 0;
}

function mostrarEvento(evento) {
    eventoActual = evento;
    const modal = document.getElementById('event-modal');
    const title = document.getElementById('event-title');
    const options = document.getElementById('event-options');

    // Eventos de decadencia aumentan crecimiento de rivales mientras están activos
    const eventosDecadencia = ['migracion', 'okupas', 'dana2'];
    gameState.decadenciaEventoActivo = eventosDecadencia.includes(evento.id);

    title.textContent = evento.titulo;
    options.innerHTML = '';

    // Detectar si es dispositivo táctil
    const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;

    // En móvil, añadir mensaje de espera
    let waitMsg = null;
    if (isTouchDevice) {
        waitMsg = document.createElement('div');
        waitMsg.className = 'event-wait-message';
        waitMsg.textContent = 'Deja de tocar para elegir...';
        options.appendChild(waitMsg);
    }

    const buttons = [];
    evento.opciones.forEach((opcion) => {
        const btn = document.createElement('button');
        // En móvil empiezan deshabilitados, en desktop activos
        if (isTouchDevice) {
            btn.className = 'event-option event-option-disabled';
            btn.disabled = true;
        } else {
            btn.className = 'event-option';
            btn.onclick = () => aplicarEfectoEvento(opcion.efecto, modal, opcion.desc);
        }
        btn.innerHTML = `${opcion.texto}<div class="event-effect">???</div>`;
        buttons.push({ btn, opcion });
        options.appendChild(btn);
    });

    modal.classList.add('active');
    audioSystem.playUnlock();
    
    // Anunciar para screen readers
    if (typeof announceEvent === 'function') {
        announceEvent(evento.titulo, 'Evento aleatorio disponible. Elige una opción.');
    }
    
    // Setup focus trap para el modal de eventos
    if (typeof setupFocusTrap === 'function') {
        setupFocusTrap(modal, () => {
            // No hacer nada al cerrar con escape, el evento debe elegirse
        });
    }

    // Solo aplicar protección en dispositivos táctiles
    if (isTouchDevice) {
        let activationTimer = null;
        let buttonsEnabled = false;

        function enableButtons() {
            if (buttonsEnabled) return;
            buttonsEnabled = true;
            if (waitMsg) waitMsg.remove();
            document.removeEventListener('touchstart', onTouchDetected);

            buttons.forEach(({ btn, opcion }) => {
                btn.classList.remove('event-option-disabled');
                btn.disabled = false;
                btn.onclick = () => aplicarEfectoEvento(opcion.efecto, modal, opcion.desc);
            });
        }

        function resetTimer() {
            if (buttonsEnabled) return;
            if (activationTimer) clearTimeout(activationTimer);
            activationTimer = setTimeout(enableButtons, 1000);
        }

        function onTouchDetected() {
            resetTimer();
        }

        document.addEventListener('touchstart', onTouchDetected, { once: true });
        resetTimer();
    }
}

function aplicarEfectoEvento(efecto, modal, descripcionEfecto) {
    audioSystem.playBuy();
    // Actualizar estadística de eventos enfrentados
    gameStats.eventosEnfrentados++;
    sessionStats.eventosEnfrentados++;

    // Lógica de balanceo por TIEMPO DE PRODUCCIÓN (votosTime)
    let cantidadVotos = 0;
    
    if (efecto.votosTime) {
        const currentVps = partidos[partidoElegido].vps;
        const segundos = efecto.votosTime;
        
        // Base mínima para early game: 1 voto/segundo
        const baseMinima = Math.abs(segundos) * 1;

        // --- BALANCEO: SOFT CAP (Curva de rendimiento decreciente) ---
        // Evita que eventos largos rompan el juego.
        // Primeros 60s -> 100% efectividad
        // El resto -> 40% efectividad
        let segundosEfectivos = Math.abs(segundos);
        if (segundosEfectivos > 60) {
            const base = 60;
            const exceso = segundosEfectivos - 60;
            segundosEfectivos = base + (exceso * 0.4);
        }
        
        // Cálculo principal: VPS * Segundos Efectivos
        let produccion = currentVps * segundosEfectivos;
        
        // Aplicar el máximo entre la producción real y la base mínima
        let valorFinal = Math.max(produccion, baseMinima);

        // --- BALANCEO: TOPES DE SEGURIDAD (Hard Caps) ---

        // 1. Tope Absoluto: Máximo 0.4% de la meta (200k votos)
        const capAbsoluto = VICTORIA_VOTOS * 0.004;

        // 2. Tope Histórico: Máximo 8% de lo generado en toda la historia
        const capHistorico = Math.max(2000, gameState.totalVotos * 0.08);

        // 3. Tope Victoria: Escala con progreso del jugador (0.1% → 1%)
        // Evita victorias instantáneas pero permite relevancia en late game.
        const progressPct = Math.min(1, partidos[partidoElegido].votos / VICTORIA_VOTOS);
        const capVictoriaPct = 0.001 + (progressPct * 0.009);
        const capVictoria = VICTORIA_VOTOS * capVictoriaPct;

        // Aplicar el límite más restrictivo
        valorFinal = Math.min(valorFinal, capAbsoluto, capHistorico, capVictoria);
        
        // Aplicar signo original
        cantidadVotos = segundos < 0 ? -valorFinal : valorFinal;

        // Aplicar zapateroBonus (+30% votos de eventos positivos)
        if (cantidadVotos > 0 && gameState.zapateroBonus > 0) {
            cantidadVotos = Math.floor(cantidadVotos * (1 + gameState.zapateroBonus));
        }
        
        // Redondear
        cantidadVotos = Math.floor(cantidadVotos);

        // Actualizar descripción para el toast
        // Añadimos la cantidad exacta de votos ganados/perdidos al final
        // Ej: "+5 min de producción (+15.400 votos)"
        const signo = cantidadVotos >= 0 ? '+' : '';
        const infoVotos = `(${signo}${Math.abs(cantidadVotos).toLocaleString()} votos)`;
        
        if (descripcionEfecto) {
            descripcionEfecto = `${descripcionEfecto} ${infoVotos}`;
        } else {
            const tiempoStr = segundosEfectivos < 60 
                ? `${Math.floor(segundosEfectivos)}s` 
                : `${(segundosEfectivos/60).toFixed(1).replace('.0','')} min`;
            descripcionEfecto = `${signo}${tiempoStr} de producción ${infoVotos}`;
        }
    } 
    // Compatibilidad hacia atrás (si queda algún 'votos' fijo)
    else if (efecto.votos) {
        cantidadVotos = efecto.votos;
    }

    // Mostrar toast con el efecto real
    if (descripcionEfecto) {
        mostrarToastEfecto(descripcionEfecto);
    }

    // Aplicar efectos de votos
    if (cantidadVotos !== 0) {
        partidos[partidoElegido].votos = Math.max(0, partidos[partidoElegido].votos + cantidadVotos);
    }
    if (efecto.charosLost && gameState.buildings.charo) {
        gameState.buildings.charo.count = Math.max(0, gameState.buildings.charo.count - efecto.charosLost);
    }
    if (efecto.charosBonus && gameState.buildings.charo) {
        gameState.buildings.charo.baseVps += efecto.charosBonus;
    }
    if (efecto.vpsLost && gameState.buildings.charo) {
        // Efecto temporal, reducir VPS por 30 segundos
        const original = gameState.buildings.charo.baseVps;
        gameState.buildings.charo.baseVps -= efecto.vpsLost;
        setTimeout(() => { gameState.buildings.charo.baseVps = original; }, 30000);
    }
    // Efectos de growth de rivales específicos
    if (efecto.ppGrowth && partidos.pp && !partidos.pp.isPlayer) {
        partidos.pp.growthRate = Math.max(0.1, partidos.pp.growthRate + efecto.ppGrowth);
    }
    if (efecto.psoeGrowth && partidos.psoe && !partidos.psoe.isPlayer) {
        partidos.psoe.growthRate = Math.max(0.1, partidos.psoe.growthRate + efecto.psoeGrowth);
    }
    if (efecto.voxGrowth && partidos.vox && !partidos.vox.isPlayer) {
        partidos.vox.growthRate = Math.max(0.1, partidos.vox.growthRate + efecto.voxGrowth);
    }
    if (efecto.podemosGrowth && partidos.podemos && !partidos.podemos.isPlayer) {
        partidos.podemos.growthRate = Math.max(0.1, partidos.podemos.growthRate + efecto.podemosGrowth);
    }
    if (efecto.allRivalsGrowth) {
        for (let key in partidos) {
            if (!partidos[key].isPlayer && partidos[key].growthRate) {
                partidos[key].growthRate = Math.max(0.1, partidos[key].growthRate + efecto.allRivalsGrowth);
            }
        }
    }
    // --- NUEVOS EFECTOS ---
    if (efecto.regionBonusCataluna) {
        partidos[partidoElegido].regionBonus.cataluna = (partidos[partidoElegido].regionBonus.cataluna || 1.0) + efecto.regionBonusCataluna;
    }
    if (efecto.buildingsBonus) {
        const maxBonus = 0.1; // Máximo +10%
        const bonus = Math.min(efecto.buildingsBonus, maxBonus);
        // Usar multiplicador acumulativo en vez de modificar baseVps permanentemente
        gameState.buildingsBonusMultiplier = (gameState.buildingsBonusMultiplier || 0) + bonus;
        markVpsDirty();
    }
    if (efecto.aliadeBonus) {
        gameState.buildings.aliade.baseVps += efecto.aliadeBonus;
    }
    if (efecto.inmigracionBonus) {
        gameState.buildings.inmigracion.baseVps += efecto.inmigracionBonus;
    }
    if (efecto.rtveBonus) {
        partidos.pp.growthRate *= (1 - efecto.rtveBonus);
        partidos.vox.growthRate *= (1 - efecto.rtveBonus);
    }
    if (efecto.egoPolitico) {
        gameState.egoPolitico += efecto.egoPolitico;
        document.getElementById('ego-display').innerText = `Ego Político: ${gameState.egoPolitico} (Bonus: +${gameState.egoPolitico * 10}%)`;
    }
    if (efecto.clickValue) {
        gameState.clickValue += efecto.clickValue;
    }
    if (efecto.indraBonus) {
        gameState.indraBonus += efecto.indraBonus;
    }
    if (efecto.corrupcionEvent) {
        gameState.eventosCorrupcionSobrevividos++;
    }
    if (efecto.cisBonus) {
        gameState.buildings.cis_cocinado.count += efecto.cisBonus;
    }
    // Efecto de venta de regiones a otros países
    if (efecto.venderRegion && typeof venderRegionAPais === 'function') {
        venderRegionAPais(efecto.venderRegion);
    }
    // Tracking de eventos virales
    if (efecto.viralEvent) {
        gameState.viralEventsActivated++;
        // Bonus 50% votos si tiene Herramienta Deepfake activa
        if (gameState.deepfakeToolActive && efecto.votos) {
            partidos[partidoElegido].votos += efecto.votos * 0.5;
        }
    }
    // Reset flag de decadencia al cerrar evento
    gameState.decadenciaEventoActivo = false;

    modal.classList.remove('active');
    calculateVPS();
    updateDisplay();
}

function checkEventoAleatorio(deltaMs) {
    if (gameState.gameOver) return;
    if (document.getElementById('event-modal').classList.contains('active')) return;

    tiempoTranscurrido += deltaMs;
    if (tiempoTranscurrido >= tiempoParaEvento && eventosPendientes.length > 0) {
        // Seleccionar evento aleatorio
        const idx = Math.floor(Math.random() * eventosPendientes.length);
        const evento = eventosPendientes.splice(idx, 1)[0];
        mostrarEvento(evento);

        // Resetear timer
        tiempoTranscurrido = 0;
        tiempoParaEvento = 120000 + Math.random() * 180000;

        // Si se acabaron los eventos, reciclar
        if (eventosPendientes.length === 0) {
            eventosPendientes = [...eventos];
        }
    }
}

// Mostrar toast con el efecto real de la opción elegida
function mostrarToastEfecto(descripcion) {
    // Crear elemento toast
    const toast = document.createElement('div');
    toast.className = 'effect-toast';
    toast.innerHTML = `<span class="effect-toast-label">Efecto:</span> ${descripcion}`;
    document.body.appendChild(toast);

    // Animar entrada
    requestAnimationFrame(() => {
        toast.classList.add('show');
    });

    // Remover después de 3 segundos
    setTimeout(() => {
        toast.classList.add('hide');
        setTimeout(() => toast.remove(), 500);
    }, 3000);
}
