// --- SISTEMA DE EVENTOS INCONTROLABLES ---
let tiempoDesdeUltimoIncontrolable = 0;
let tiempoAcumuladoCheck = 0;
const COOLDOWN_INCONTROLABLE = 45000; // 45 segundos mínimo entre eventos
const INTERVALO_CHECK = 30000; // Verificar cada 30 segundos
const PROBABILIDAD = 0.03; // 3% de probabilidad
const AUTO_DISMISS_TIME = 8000; // 8 segundos de auto-cierre

// Anti-spam: timestamp del último evento disparado (protección contra múltiples ejecuciones)
let ultimoEventoTimestamp = 0;
const MIN_TIEMPO_ENTRE_EVENTOS = 1000; // 1 segundo mínimo entre ejecuciones

let eventosIncontrolablesPendientes = [];

function initEventosIncontrolables() {
    eventosIncontrolablesPendientes = [...eventosIncontrolables];
    tiempoDesdeUltimoIncontrolable = COOLDOWN_INCONTROLABLE; // Permitir que ocurra desde el inicio
    tiempoAcumuladoCheck = 0;
}

function checkEventoIncontrolable(deltaMs) {
    if (gameState.gameOver) return;

    // No activar si hay un modal de evento normal activo
    if (document.getElementById('event-modal').classList.contains('active')) return;

    // No activar si hay un modal de evento incontrolable activo
    if (document.getElementById('uncontrollable-event-modal').classList.contains('active')) return;

    // Acumular tiempo desde último evento incontrolable
    tiempoDesdeUltimoIncontrolable += deltaMs;

    // Verificar cooldown
    if (tiempoDesdeUltimoIncontrolable < COOLDOWN_INCONTROLABLE) return;

    // Acumular tiempo para el check periódico
    tiempoAcumuladoCheck += deltaMs;

    // Verificar solo cada INTERVALO_CHECK ms
    if (tiempoAcumuladoCheck >= INTERVALO_CHECK) {
        tiempoAcumuladoCheck = 0;

        // 3% de probabilidad
        if (Math.random() < PROBABILIDAD) {
            dispararEventoIncontrolable();
        }
    }
}

function dispararEventoIncontrolable() {
    // Anti-spam: verificar que ha pasado suficiente tiempo desde el último evento
    const ahora = Date.now();
    if (ahora - ultimoEventoTimestamp < MIN_TIEMPO_ENTRE_EVENTOS) {
        console.warn('[EVENTO INCONTROLABLE] Ignorado - cooldown activo (anti-spam)', {
            tiempoDesdeUltimo: ahora - ultimoEventoTimestamp,
            minRequerido: MIN_TIEMPO_ENTRE_EVENTOS
        });
        return;
    }
    ultimoEventoTimestamp = ahora;

    if (eventosIncontrolablesPendientes.length === 0) {
        eventosIncontrolablesPendientes = [...eventosIncontrolables];
    }

    // Seleccionar evento aleatorio
    const idx = Math.floor(Math.random() * eventosIncontrolablesPendientes.length);
    const evento = eventosIncontrolablesPendientes.splice(idx, 1)[0];

    // Logging de diagnóstico
    console.log('[EVENTO INCONTROLABLE] Disparando:', {
        id: evento.id,
        titulo: evento.titulo,
        timestamp: ahora,
        votosAntes: partidos[partidoElegido].votos
    });

    // Ejecutar efecto y obtener resultado (ahora devuelve un objeto)
    const resultado = evento.efecto();
    let mensaje = "";
    
    // Calcular votos basados en tiempo si existe la propiedad
    if (resultado.votosTime) {
        const currentVps = partidos[partidoElegido].vps;
        const segundos = resultado.votosTime;
        
        // Base mínima para early game (reducida a 2 votos/segundo)
        const baseMinima = Math.abs(segundos) * 2;
        
        // Cálculo principal
        let produccion = currentVps * Math.abs(segundos);
        let valorFinal = Math.max(produccion, baseMinima);
        
        // --- BALANCEO: TOPES DE SEGURIDAD ---
        // 1. Tope Histórico (50% del total generado)
        const capHistorico = Math.max(1000, gameState.totalVotos * 0.5);
        // 2. Tope Global (1% de la victoria = 500k)
        const capVictoria = VICTORIA_VOTOS * 0.01;
        
        // Aplicar límites a la ganancia base (antes de signo)
        valorFinal = Math.min(valorFinal, capHistorico, capVictoria);
        
        // Límite de seguridad extra para pérdidas (-300s / 5 min)
        // Ya está limitado por datos (-300), pero por si acaso calculamos el valor de 5 min
        if (segundos < 0) {
            const maxLoss = currentVps * 300; 
            // Si la pérdida calculada es mayor que 5 min de producción real, la capamos
            // (Aunque el valorFinal ya está capado por 500k, esto protege de perder horas de prod si el VPS es bajo pero el cap alto)
            if (valorFinal > maxLoss && maxLoss > baseMinima) {
                 valorFinal = maxLoss;
            }
        }
        
        let cantidadVotos = Math.floor(segundos < 0 ? -valorFinal : valorFinal);
        
        // Aplicar cambio de votos
        partidos[partidoElegido].votos = Math.max(0, partidos[partidoElegido].votos + cantidadVotos);
        
        // Añadir info al mensaje
        const signo = cantidadVotos >= 0 ? '+' : '';
        mensaje = `${resultado.mensaje} (${signo}${Math.floor(Math.abs(cantidadVotos)).toLocaleString()} votos)`;
    } else {
        // Fallback por si acaso
        mensaje = resultado.toString();
    }

    // Logging post-efecto
    console.log('[EVENTO INCONTROLABLE] Efecto ejecutado:', {
        votosDespues: partidos[partidoElegido].votos
    });

    // Mostrar modal
    mostrarEventoIncontrolable(evento, mensaje);

    // Resetear cooldown
    tiempoDesdeUltimoIncontrolable = 0;

    // Actualizar UI
    calculateVPS();
    updateDisplay();
}

function mostrarEventoIncontrolable(evento, mensaje) {
    const modal = document.getElementById('uncontrollable-event-modal');
    const title = document.getElementById('uncontrollable-event-title');
    const content = document.getElementById('uncontrollable-event-content');
    const countdown = document.getElementById('uncontrollable-countdown-bar');

    title.textContent = evento.titulo;
    content.textContent = mensaje;

    // Resetear y animar barra de countdown
    countdown.style.transition = 'none';
    countdown.style.width = '100%';

    // Forzar reflow para reiniciar animación
    countdown.offsetHeight;

    // Animar la barra
    countdown.style.transition = `width ${AUTO_DISMISS_TIME}ms linear`;
    countdown.style.width = '0%';

    // Mostrar modal con animación
    modal.classList.add('active');
    audioSystem.playError();
    
    // Anunciar para screen readers
    if (typeof announceEvent === 'function') {
        announceEvent(evento.titulo, mensaje);
    }

    // Auto-dismiss después de 4 segundos
    setTimeout(() => {
        modal.classList.remove('active');
    }, AUTO_DISMISS_TIME);
}
