// --- ESTADO DEL JUEGO (para el jugador - PSOE o PP según partidoElegido) ---
const gameState = {
    totalVotos: 0,
    egoPolitico: 0,
    gameOver: false,
    buildings: {},
    upgrades: {},
    clickValue: 1,
    // Estados para upgrades
    tertulianoActive: false,
    correosActive: false,
    correosTimer: 0,
    correosBoostActive: false,
    indraBonus: 0,
    corrupcionActive: false,
    eventosCorrupcionSobrevividos: 0,
    decadenciaEventoActivo: false,
    // Sistema de deuda e inflación
    deuda: 0,
    inflacion: 0,
    // Sistema de déficit (reemplaza fatiga)
    deficit: 0,                   // 0 a DEFICIT_MAX (1000)
    bonosVendidos: 0,             // Contador de ventas de bonos (para escalar)
    // Sistema de clicks dinámicos
    clickVpsRatio: 0.02,          // 2% del VPS por click (base, modificable por upgrades)
    clickCritChance: 0,           // Probabilidad de click crítico (0-1)
    votosDesdeClicks: 0,          // Total de votos ganados por clicks (para logros)
    totalClicks: 0,               // Contador total de clicks (para logros)
    // Nuevas mecánicas (v5)
    viralEventsActivated: 0,      // Contador eventos virales
    regionesPerdidas: 0,          // Regiones perdidas (para logro)
    deepfakeToolActive: false,    // Upgrade activo
    prestigeLevel: 0,             // Nivel de prestige mejorado
    prestigeBonuses: {
        vpsMultiplier: 1.0,
        costReduction: 1.0
    },
    // Reset Progresista (v6)
    resetProgresistaCount: 0,     // Veces usado el reset progresista
    aiDifficultyReduction: 0,     // Reducción acumulada de dificultad IA
    // Reset de Dificultad (v9)
    dificultadResetCount: 0,      // Veces resetada la dificultad (reduce poder en 50% cada vez)
    // Sistema de Ascensión (v7)
    castaAcumulada: 0,            // Casta total ganada en todas las ascensiones
    castaGastada: 0,              // Casta gastada en privilegios
    ascensionCount: 0,            // Número de ascensiones completadas
    privilegiosComprados: [],     // Array de IDs de privilegios comprados
    eliminatedRival: null,        // Rival eliminado en este run (si tiene el privilegio)
    // Fase 2: Gobierno (v8)
    gamePhase: 'campaign',        // 'campaign' | 'government'
    governmentTimeLeft: 0,        // Tiempo restante para completar fase gobierno (ms)
    governmentStartVotos: 0,      // Votos al iniciar fase gobierno
    governmentMinVotos: 0,        // Votos mínimos para mantener gobierno (40M)
    governmentCompleted: false,   // Si completó la fase gobierno con éxito
    // Nuevos flags de balance (v11)
    campanaActive: false,         // Campaña Electoral: +3% VPS por región
    monteroActive: false,         // Montero Sanidad: +15% VPS si >500 VPS base
    euFundsActive: false,         // EU Funds: +35% decayendo a +15%
    euFundsStartTime: 0,          // Timestamp de activación de EU Funds
    suscripcionBonus: 0,          // Suscripción Público: +5% VPS permanente
    zapateroBonus: 0,             // Zapatero Mediador: +30% votos de eventos
    // Sistema de venta de regiones (v12)
    regionesVendidas: {},         // { canarias: 'marruecos', baleares: 'alemania' }
    // --- OPTIMIZACIÓN P2: Dirty-checking para VPS ---
    _vpsDirty: true,              // Flag para recalcular VPS
    _cachedVps: 0,                // VPS cacheado
    _lastRegionesControladas: 0   // Para detectar cambios en regiones
};

// Inicializar estado del juego con los datos
function initGameState() {
    // 1. RESET TOTAL DE VARIABLES DE JUEGO (Evitar persistencia de bugs)
    gameState.totalVotos = 0;
    gameState.egoPolitico = 0;
    gameState.gameOver = false;
    gameState.clickValue = 1;
    gameState.runStartedAt = Date.now();
    
    // Estados de upgrades y boosts
    gameState.tertulianoActive = false;
    gameState.correosActive = false;
    gameState.correosTimer = 0;
    gameState.correosBoostActive = false;
    gameState.indraBonus = 0;
    gameState.corrupcionActive = false;
    gameState.eventosCorrupcionSobrevividos = 0;
    gameState.decadenciaEventoActivo = false;
    
    // Economía
    gameState.deuda = 0;
    gameState.inflacion = 0;
    gameState.deficit = 0;
    gameState.bonosVendidos = 0;
    
    // Clicks dinámicos
    gameState.clickVpsRatio = 0.02;
    gameState.clickCritChance = 0;
    gameState.votosDesdeClicks = 0;
    gameState.totalClicks = 0;
    
    // Contadores mecánicas v5
    gameState.viralEventsActivated = 0;
    gameState.regionesPerdidas = 0;
    gameState.deepfakeToolActive = false;
    gameState.prestigeLevel = 0;
    gameState.prestigeBonuses = {
        vpsMultiplier: 1.0,
        costReduction: 1.0
    };
    
    // Reset Progresista
    gameState.resetProgresistaCount = 0;
    gameState.aiDifficultyReduction = 0;
    
    // Fase Gobierno
    gameState.gamePhase = 'campaign';
    gameState.governmentTimeLeft = 0;
    gameState.governmentStartVotos = 0;
    gameState.governmentMinVotos = 0;
    gameState.governmentCompleted = false;

    // Nuevos flags de balance (v11)
    gameState.campanaActive = false;
    gameState.monteroActive = false;
    gameState.euFundsActive = false;
    gameState.euFundsStartTime = 0;
    gameState.suscripcionBonus = 0;
    gameState.zapateroBonus = 0;
    gameState.corruptionShield = false;
    gameState.buildingsBonusMultiplier = 0;

    // Sistema de venta de regiones
    gameState.regionesVendidas = {};

    // Reset dirty-checking de VPS
    gameState._vpsDirty = true;
    gameState._cachedVps = 0;
    gameState._lastRegionesControladas = 0;

    // 2. LIMPIEZA DE OBJETOS DINÁMICOS
    gameState.buildings = {};
    gameState.upgrades = {};

    // 3. CLONAR DATOS BASE (Asegura que baseVps y costes vuelvan a valores de fábrica)
    for (let key in buildingsData) {
        // Clonamos profundamente para evitar modificar el objeto 'data' original
        gameState.buildings[key] = JSON.parse(JSON.stringify(buildingsData[key]));
        gameState.buildings[key].count = 0;
    }
    
    for (let key in upgradesData) {
        gameState.upgrades[key] = { ...upgradesData[key], bought: false };
    }

    // 4. AÑADIR EDIFICIOS ESPECIALES (Ascensión)
    initAscensionBuildings();
    
    console.log('[GAMESTATE] Estado reinicializado completamente.');
}

// Inicializar edificios de ascensión desbloqueados por privilegios
function initAscensionBuildings() {
    if (typeof ascensionBuildingsData === 'undefined') return;

    const bonuses = typeof calcularBonusesPrivilegios === 'function'
        ? calcularBonusesPrivilegios()
        : { unlockedBuildings: [] };

    for (let key in ascensionBuildingsData) {
        const bldg = ascensionBuildingsData[key];
        // Solo añadir si el privilegio está desbloqueado
        if (bonuses.unlockedBuildings.includes(key)) {
            if (!gameState.buildings[key]) {
                gameState.buildings[key] = { ...bldg, count: 0 };
            }
        }
    }
}

// --- OPTIMIZACIÓN P2: Dirty-checking para VPS ---
// Invalida el cálculo cacheado cuando cambian factores relevantes
function markVpsDirty() {
    gameState._vpsDirty = true;
}

// Calcular VPS del jugador (con dirty-checking)
function calculateVPS() {
    // Si no está dirty, devolver valor cacheado
    if (!gameState._vpsDirty) {
        return gameState._cachedVps;
    }

    // Obtener bonuses de privilegios
    const privBonuses = typeof calcularBonusesPrivilegios === 'function'
        ? calcularBonusesPrivilegios()
        : { vpsMultiplier: 0, baseVps: 0, buildingBonus: {} };

    let total = 0;

    // VPS base de privilegios (La Paguita, etc.)
    total += privBonuses.baseVps || 0;

    // VPS de edificios
    for (let key in gameState.buildings) {
        let buildingVps = gameState.buildings[key].count * gameState.buildings[key].baseVps;
        // Bonus específico por edificio (Puerta Giratoria)
        if (privBonuses.buildingBonus && privBonuses.buildingBonus[key]) {
            buildingVps *= (1 + privBonuses.buildingBonus[key]);
        }
        total += buildingVps;
    }

    // --- BALANCE v11: Late-game synergy bonus ---
    // +2% VPS por cada edificio late-game (coste base >250K), max +40%
    const lateGameBuildings = ['begona', 'pactosParl', 'fiscalia', 'falcon',
                               'bildu', 'cis_cocinado', 'diaspora', 'eurodiputado'];
    let lateGameCount = 0;
    for (let key of lateGameBuildings) {
        if (gameState.buildings[key]) {
            lateGameCount += gameState.buildings[key].count;
        }
    }
    const lateGameSynergyBonus = typeof LATE_GAME_SYNERGY_BONUS !== 'undefined' ? LATE_GAME_SYNERGY_BONUS : 0.02;
    const lateGameSynergyCap = typeof LATE_GAME_SYNERGY_CAP !== 'undefined' ? LATE_GAME_SYNERGY_CAP : 0.4;
    const lateGameBonus = Math.min(lateGameCount * lateGameSynergyBonus, lateGameSynergyCap);
    total *= (1 + lateGameBonus);

    // Bonus por Prestigio (Ego) - capeado a +50% máximo
    const egoBonus = Math.min(gameState.egoPolitico * 0.1, 0.5);
    total *= (1 + egoBonus);

    // Bonus Tertuliano Afín (+25% si >10M votos)
    if (gameState.tertulianoActive && partidos[partidoElegido].votos > 10000000) {
        total *= 1.25;
    }

    // --- BALANCE v11: Suscripción bonus (+5% VPS permanente) ---
    total *= (1 + (gameState.suscripcionBonus || 0));

    // --- Bonus de eventos buildingsBonus (acumulativo, no permanente en baseVps) ---
    if (gameState.buildingsBonusMultiplier > 0) {
        total *= (1 + gameState.buildingsBonusMultiplier);
    }

    // --- BALANCE v11: Campaña condicional por regiones ---
    // +3% VPS por región controlada (max +51% con 17 regiones)
    if (gameState.campanaActive && typeof regiones !== 'undefined') {
        let regionesControladas = 0;
        for (let key in regiones) {
            if (regiones[key].controlador === partidoElegido) {
                regionesControladas++;
            }
        }
        // Guardar para detectar cambios futuros
        gameState._lastRegionesControladas = regionesControladas;
        total *= (1 + regionesControladas * 0.03);
    }

    // --- BALANCE v11: Montero condicionado (+15% si VPS base > 500) ---
    if (gameState.monteroActive && total > 500) {
        total *= 1.15;
    }

    // --- BALANCE v11: EU funds con decay (+35% decayendo a +15% en 10 min) ---
    // NOTA: EU funds cambia con el tiempo, siempre recalcular si está activo
    if (gameState.euFundsActive) {
        const elapsed = Date.now() - (gameState.euFundsStartTime || Date.now());
        const decay = Math.min(elapsed / 600000, 1); // 10 min = 600000ms
        const euBonus = 0.35 - (decay * 0.20); // 0.35 → 0.15
        total *= (1 + euBonus);
    }

    // Bonus por Prestige permanente
    total *= gameState.prestigeBonuses.vpsMultiplier;

    // Bonus por Reset Progresista (+10% por uso, capeado a +50% máximo)
    const resetBonus = Math.min(gameState.resetProgresistaCount * 0.1, 0.5);
    total *= (1 + resetBonus);

    // Bonus por privilegios de VPS (Maletín de Andorra, Sanchismo Eterno, etc.)
    total *= (1 + (privBonuses.vpsMultiplier || 0));

    // Guardar en cache y marcar como limpio
    gameState._cachedVps = total;
    gameState._vpsDirty = false;

    partidos[partidoElegido].vps = total;
    return total;
}
