// --- REFERENCIAS DOM ---
let votosDisplay, vpsDisplay, progressBar, progressText, deudaDisplay, inflacionDisplay;

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

// --- REFERENCIAS DOM CORRUPCIÓN ---
let drogasCount, putasCount, teflonBonusEl, corrupcionPanel;
let lastCorrupcionTotal = 0;
let lastEscandaloCheck = 0;
const ESCANDALO_COOLDOWN = 120000; // 2 min entre checks

function initCorrupcionRefs() {
    drogasCount = document.getElementById('drogas-count');
    putasCount = document.getElementById('putas-count');
    teflonBonusEl = document.getElementById('teflon-bonus');
    corrupcionPanel = document.getElementById('corrupcion-panel');
}

function initDisplayRefs() {
    votosDisplay = document.getElementById('votos-display');
    vpsDisplay = document.getElementById('vps-display');
    progressBar = document.getElementById('progress-bar');
    progressText = document.getElementById('progress-text');
    deudaDisplay = document.getElementById('deuda-display');
    inflacionDisplay = document.getElementById('inflacion-display');
    initCorrupcionRefs();
    initAriaLiveRefs();
}

// Formatear números grandes para deuda
function formatDeuda(num) {
    let valor;
    if (num >= 1000000000000) valor = (num / 1000000000000).toFixed(1) + 'T';
    else if (num >= 1000000000) valor = (num / 1000000000).toFixed(1) + 'B';
    else if (num >= 1000000) valor = (num / 1000000).toFixed(1) + 'M';
    else if (num >= 1000) valor = (num / 1000).toFixed(1) + 'K';
    else valor = Math.floor(num).toLocaleString();
    return valor + ' €';
}

// Comparaciones humorísticas para la deuda
function getComparacionDeuda(num) {
    if (num < 1000000) return '(1 sauna ministerial)';
    if (num < 10000000) return `(${Math.floor(num/1000000)} aeropuertos de Castellón)`;
    if (num < 100000000) return `(${Math.floor(num/10000000)} rescates de autopistas)`;
    if (num < 1000000000) return `(${Math.floor(num/100000000)} AVEs a ninguna parte)`;
    return `(${Math.floor(num/1000000000)} proyectos Castor)`;
}

// Colores dinámicos según gravedad de la deuda
function getColorDeuda(num) {
    if (num < 100000) return '#28a745';      // Verde
    if (num < 1000000) return '#ffc107';     // Amarillo
    if (num < 100000000) return '#fd7e14';   // Naranja
    return '#dc3545';                         // Rojo
}

// Colores dinámicos según gravedad de la inflación
function getColorInflacion(pct) {
    if (pct < 5) return '#28a745';           // Verde
    if (pct < 20) return '#ffc107';          // Amarillo
    if (pct < 100) return '#fd7e14';         // Naranja
    return '#dc3545';                         // Rojo
}

// --- VARIABLES ESTADO UI ---
let lastShopUpdate = 0;
const SHOP_UPDATE_THROTTLE_MAX = 250; // Actualizar más rápido en modo MAX (4fps)
const SHOP_UPDATE_THROTTLE_NORMAL = 1000; // Actualizar lento en modo normal (1fps)

// --- TOOLTIPS TÁCTILES (Long-press para móvil) ---
let tooltipTouchTimer = null;
let activeTooltipElement = null;
const TOOLTIP_LONG_PRESS_DELAY = 500; // ms

function initMobileTooltips() {
    // Solo inicializar en dispositivos táctiles
    if (!('ontouchstart' in window)) return;
    
    const tooltipElements = document.querySelectorAll('[data-tooltip]');
    
    tooltipElements.forEach(el => {
        el.addEventListener('touchstart', handleTooltipTouchStart, { passive: true });
        el.addEventListener('touchend', handleTooltipTouchEnd, { passive: true });
        el.addEventListener('touchcancel', handleTooltipTouchEnd, { passive: true });
    });
    
    // Cerrar tooltips al tocar fuera
    document.addEventListener('touchstart', (e) => {
        if (!e.target.closest('[data-tooltip]')) {
            hideMobileTooltip();
        }
    }, { passive: true });
}

function handleTooltipTouchStart(e) {
    const tooltipText = this.getAttribute('data-tooltip');
    if (!tooltipText) return;
    
    // Limpiar timer previo
    if (tooltipTouchTimer) clearTimeout(tooltipTouchTimer);
    
    tooltipTouchTimer = setTimeout(() => {
        showMobileTooltip(this, tooltipText);
    }, TOOLTIP_LONG_PRESS_DELAY);
}

function handleTooltipTouchEnd() {
    if (tooltipTouchTimer) {
        clearTimeout(tooltipTouchTimer);
        tooltipTouchTimer = null;
    }
}

function showMobileTooltip(element, text) {
    hideMobileTooltip();
    
    // Crear o reutilizar tooltip global
    let tooltip = document.getElementById('mobile-tooltip');
    if (!tooltip) {
        tooltip = document.createElement('div');
        tooltip.id = 'mobile-tooltip';
        tooltip.className = 'tooltip tooltip-mobile-visible';
        document.body.appendChild(tooltip);
    }
    
    tooltip.textContent = text;
    tooltip.classList.add('tooltip-mobile-visible');
    activeTooltipElement = element;
}

function hideMobileTooltip() {
    const tooltip = document.getElementById('mobile-tooltip');
    if (tooltip) {
        tooltip.classList.remove('tooltip-mobile-visible');
    }
    activeTooltipElement = null;
}

// --- ACTUALIZAR DISPLAY ---
function updateDisplay() {
    const playerParty = partidos[partidoElegido];
    if (votosDisplay) votosDisplay.innerText = `${playerParty.emoji} ${Math.floor(playerParty.votos).toLocaleString()} Votos`;
    if (vpsDisplay) vpsDisplay.innerText = `Generando: ${playerParty.vps.toFixed(1)} VPS`;

    // Actualizar contadores de deuda e inflación con colores y comparaciones
    if (deudaDisplay) {
        const colorDeuda = getColorDeuda(gameState.deuda);
        const comparacion = getComparacionDeuda(gameState.deuda);
        deudaDisplay.innerHTML = `Deuda: <span style="color:${colorDeuda}">${formatDeuda(gameState.deuda)}</span> <span style="font-size:0.7em;opacity:0.8">${comparacion}</span>`;
    }

    if (inflacionDisplay) {
        const colorInflacion = getColorInflacion(gameState.inflacion);
        inflacionDisplay.innerHTML = `Inflación: <span style="color:${colorInflacion}">${gameState.inflacion.toFixed(1)}%</span>`;
    }

    // Actualizar Tienda (precios y estados) con Throttling
    const now = Date.now();
    const throttleTime = (currentMultiplier === 'max') ? SHOP_UPDATE_THROTTLE_MAX : SHOP_UPDATE_THROTTLE_NORMAL;
    
    if (now - lastShopUpdate > throttleTime) {
        if (typeof updateShopPrices === 'function') {
            updateShopPrices();
        }
        lastShopUpdate = now;
    }

    // Mostrar prestigio con umbral progresivo (1M * 1.5^vecesPrestigiado)
    const prestigeThreshold = 1000000 * Math.pow(1.5, gameStats.vecesPrestigiado || 0);
    const prestigeContainer = document.getElementById('prestige-container');
    if (prestigeContainer) {
        if (gameState.totalVotos > prestigeThreshold) {
            prestigeContainer.style.display = 'block';
        } else {
            prestigeContainer.style.display = 'none';
        }
    }

    distribuirVotosRegionales();
    updateMap();
    renderRanking();
    updateProgressBar();
    updateCorrupcionStats();
}

// --- ACTUALIZAR BARRA DE PROGRESO ---
function updateProgressBar() {
    if (!progressBar || !progressText) return;
    const leaderVotos = Math.max(...Object.values(partidos).map(p => p.votos));
    const percentage = Math.min(100, (leaderVotos / VICTORIA_VOTOS) * 100);
    progressBar.style.width = percentage + '%';

    const leaderPartido = Object.values(partidos).find(p => p.votos === leaderVotos);
    progressBar.style.background = `linear-gradient(90deg, ${leaderPartido.color}, ${leaderPartido.color}aa)`;

    const votosStr = leaderVotos >= 1000000
        ? (leaderVotos / 1000000).toFixed(1) + 'M'
        : Math.floor(leaderVotos).toLocaleString();
    progressText.textContent = `${votosStr} / 50M votos`;
}

// --- SISTEMA DE CORRUPCIÓN ---
function updateCorrupcionStats() {
    // Calcular drogas: votos / 500,000
    const drogas = Math.floor(partidos[partidoElegido].votos / 500000);

    // Calcular putas: VPS / 50,000 + Koldos * 10
    const koldosCount = gameState.buildings.koldo ? gameState.buildings.koldo.count : 0;
    const putas = Math.floor(partidos[partidoElegido].vps / 50000) + (koldosCount * 10);

    // Total y bonus
    const total = drogas + putas;
    const bonus = Math.min(total / 100, 0.5); // Max 50%

    // Guardar en gameState para uso en clicks
    gameState.corrupcionDrogas = drogas;
    gameState.corrupcionPutas = putas;
    gameState.corrupcionTotal = total;
    gameState.teflonBonus = bonus;

    // Animación si subió
    if (total > lastCorrupcionTotal && corrupcionPanel) {
        corrupcionPanel.classList.add('corrupcion-pulse');
        setTimeout(() => corrupcionPanel.classList.remove('corrupcion-pulse'), 500);
    }
    lastCorrupcionTotal = total;

    // Actualizar UI
    if (drogasCount) drogasCount.textContent = drogas.toLocaleString();
    if (putasCount) putasCount.textContent = putas.toLocaleString();
    if (teflonBonusEl) {
        const pct = (bonus * 100).toFixed(0);
        teflonBonusEl.textContent = `+${pct}%`;
        teflonBonusEl.style.color = bonus >= 0.5 ? '#dc3545' : bonus > 0.25 ? '#ffc107' : '#28a745';
    }

    // Verificar evento de escándalo
    checkEventoEscandalo(total);
}

function checkEventoEscandalo(total) {
    if (total <= 500) return;

    // Immunity from corruptionShield (Suscripción Premium upgrade)
    if (gameState.corruptionShield) return;

    const now = Date.now();
    if (now - lastEscandaloCheck < ESCANDALO_COOLDOWN) return;
    lastEscandaloCheck = now;

    // 5% probabilidad por check
    if (Math.random() < 0.05) {
        dispararEscandaloCorrupcion(total);
    }
}

function dispararEscandaloCorrupcion(total) {
    const votosLost = Math.floor(total * 100);
    partidos[partidoElegido].votos = Math.max(0, partidos[partidoElegido].votos - votosLost);

    // Perder algunos Koldos
    if (gameState.buildings.koldo && gameState.buildings.koldo.count > 0) {
        const koldosLost = Math.min(3, gameState.buildings.koldo.count);
        gameState.buildings.koldo.count -= koldosLost;
    }

    gameState.eventosCorrupcionSobrevividos++;

    // Mostrar popup (usa función existente del juego)
    if (typeof mostrarEventoIncontrolable === 'function') {
        mostrarEventoIncontrolable(
            { titulo: "💊 SOBREDOSIS EN MONCLOA 💊" },
            `¡La corrupción (${total}) ha sido expuesta! Prensa: "Drogas y escorts en el entorno gubernamental". Pierdes ${votosLost.toLocaleString()} votos.`
        );
    }

    calculateVPS();
}


// Inicializar referencias aria-live cuando el DOM esté listo
if (typeof document !== 'undefined') {
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initAriaLiveRefs);
    } else {
        // Si ya está cargado, inicializar en el próximo frame
        setTimeout(initAriaLiveRefs, 0);
    }
}
