// --- SISTEMA DE PERSISTENCIA (LocalStorage) ---

function saveGame() {
    // Evitar guardar si estamos borrando datos
    if (typeof isWipingData !== 'undefined' && isWipingData) {
        console.log('[Persist] Guardado bloqueado - borrado en curso');
        return;
    }

    const saveData = {
        version: SAVE_VERSION,
        timestamp: Date.now(),
        partidoElegido: partidoElegido,
        gameState: {
            totalVotos: gameState.totalVotos,
            egoPolitico: gameState.egoPolitico,
            clickValue: gameState.clickValue,
            tertulianoActive: gameState.tertulianoActive,
            correosActive: gameState.correosActive,
            indraBonus: gameState.indraBonus,
            corrupcionActive: gameState.corrupcionActive,
            eventosCorrupcionSobrevividos: gameState.eventosCorrupcionSobrevividos,
            decadenciaEventoActivo: gameState.decadenciaEventoActivo,
            deuda: gameState.deuda,
            inflacion: gameState.inflacion,
            // Campos v5
            viralEventsActivated: gameState.viralEventsActivated,
            regionesPerdidas: gameState.regionesPerdidas,
            deepfakeToolActive: gameState.deepfakeToolActive,
            prestigeLevel: gameState.prestigeLevel,
            prestigeBonuses: gameState.prestigeBonuses,
            // Campos v6 - Déficit y Reset Progresista
            deficit: gameState.deficit,
            bonosVendidos: gameState.bonosVendidos,
            resetProgresistaCount: gameState.resetProgresistaCount,
            aiDifficultyReduction: gameState.aiDifficultyReduction,
            // Campos v7 - Sistema de Ascensión
            castaAcumulada: gameState.castaAcumulada,
            castaGastada: gameState.castaGastada,
            ascensionCount: gameState.ascensionCount,
            privilegiosComprados: gameState.privilegiosComprados,
            eliminatedRival: gameState.eliminatedRival,
            dificultadResetCount: gameState.dificultadResetCount,
            // Campos v8 - Fase Gobierno
            gamePhase: gameState.gamePhase,
            governmentTimeLeft: gameState.governmentTimeLeft,
            governmentStartVotos: gameState.governmentStartVotos,
            governmentMinVotos: gameState.governmentMinVotos,
            governmentCompleted: gameState.governmentCompleted,
            // Campos v10 - Sistema de Clicks Dinámicos
            clickVpsRatio: gameState.clickVpsRatio,
            clickCritChance: gameState.clickCritChance,
            votosDesdeClicks: gameState.votosDesdeClicks,
            totalClicks: gameState.totalClicks,
            // Campos v11 - Balance de upgrades
            campanaActive: gameState.campanaActive,
            monteroActive: gameState.monteroActive,
            euFundsActive: gameState.euFundsActive,
            euFundsStartTime: gameState.euFundsStartTime,
            suscripcionBonus: gameState.suscripcionBonus,
            zapateroBonus: gameState.zapateroBonus,
            corruptionShield: gameState.corruptionShield,
            buildingsBonusMultiplier: gameState.buildingsBonusMultiplier,
            // Campos v12 - Sistema de Venta de Regiones
            regionesVendidas: gameState.regionesVendidas,
            buildings: {},
            upgrades: {}
        },
        partidos: {},
        logros: {},
        stats: {
            votosHistoricos: gameStats.votosHistoricos,
            totalClicks: gameStats.totalClicks,
            tiempoJuegoMs: gameStats.tiempoJuegoMs,
            edificiosTotalesComprados: gameStats.edificiosTotalesComprados,
            upgradesDesbloqueados: gameStats.upgradesDesbloqueados,
            eventosEnfrentados: gameStats.eventosEnfrentados,
            vecesPrestigiado: gameStats.vecesPrestigiado,
            maxVotosAlcanzados: gameStats.maxVotosAlcanzados
        },
        sessionStats: {
            clicks: sessionStats.clicks,
            tiempoMs: sessionStats.tiempoMs,
            edificiosComprados: sessionStats.edificiosComprados,
            upgradesComprados: sessionStats.upgradesComprados,
            eventosEnfrentados: sessionStats.eventosEnfrentados
        },
        currentHeadlineIndex: currentHeadlineIndex
    };

    // Guardar edificios
    for (let key in gameState.buildings) {
        saveData.gameState.buildings[key] = {
            cost: gameState.buildings[key].cost,
            baseVps: gameState.buildings[key].baseVps,
            count: gameState.buildings[key].count
        };
    }

    // Guardar upgrades
    for (let key in gameState.upgrades) {
        saveData.gameState.upgrades[key] = {
            bought: gameState.upgrades[key].bought
        };
    }

    // Guardar partidos
    for (let key in partidos) {
        saveData.partidos[key] = {
            votos: partidos[key].votos,
            vps: partidos[key].vps,
            growthRate: partidos[key].growthRate || null
        };
    }

    // Guardar logros
    for (let key in logros) {
        saveData.logros[key] = { unlocked: logros[key].unlocked };
    }

    try {
        localStorage.setItem(SAVE_KEY, JSON.stringify(saveData));

        // Si estamos en Capacitor, también guardar en Preferences
        if (typeof saveGameDual === 'function' && CapacitorPersistence && CapacitorPersistence.isCapacitor) {
            saveGameDual(saveData);
        }

        showSaveIndicator();
    } catch (e) {
        console.error('Error guardando:', e);
    }
}

function loadGame() {
    try {
        const saved = localStorage.getItem(SAVE_KEY);
        if (!saved) return false;

        // Try-catch específico para JSON corrupto
        let saveData;
        try {
            saveData = JSON.parse(saved);
        } catch (parseError) {
            console.error('[Persist] JSON corrupto, borrando datos:', parseError);
            localStorage.removeItem(SAVE_KEY);
            return false;
        }

        if (!saveData || saveData.version < 3) {
            // Versión muy antigua o datos inválidos, empezar de nuevo
            console.log('[Persist] Versión incompatible o datos inválidos, borrando datos');
            localStorage.removeItem(SAVE_KEY);
            return false;
        }

        // Migración v4 → v5
        if (saveData.version === 4) {
            saveData.gameState.viralEventsActivated = 0;
            saveData.gameState.regionesPerdidas = 0;
            saveData.gameState.deepfakeToolActive = false;
            saveData.gameState.prestigeLevel = 0;
            saveData.gameState.prestigeBonuses = { vpsMultiplier: 1.0, costReduction: 1.0 };
            saveData.version = 5;
        }

        // Migración v5 → v6 (déficit y reset progresista)
        if (saveData.version === 5) {
            // Migrar fatiga a déficit (reset a 0)
            saveData.gameState.deficit = 0;
            saveData.gameState.bonosVendidos = 0;
            // Nuevos campos de Reset Progresista
            saveData.gameState.resetProgresistaCount = 0;
            saveData.gameState.aiDifficultyReduction = 0;
            saveData.version = 6;
        }

        // Migración v6 → v7 (sistema de ascensión)
        if (saveData.version === 6) {
            saveData.gameState.castaAcumulada = 0;
            saveData.gameState.castaGastada = 0;
            saveData.gameState.ascensionCount = 0;
            saveData.gameState.privilegiosComprados = [];
            saveData.gameState.eliminatedRival = null;
            saveData.version = 7;
        }

        // Migración v7 → v8 (fase gobierno)
        if (saveData.version === 7) {
            saveData.gameState.gamePhase = 'campaign';
            saveData.gameState.governmentTimeLeft = 0;
            saveData.gameState.governmentStartVotos = 0;
            saveData.gameState.governmentMinVotos = 0;
            saveData.gameState.governmentCompleted = false;
            saveData.version = 8;
        }

        // Migración v8 → v9 (selector de partido)
        if (saveData.version === 8) {
            saveData.partidoElegido = 'psoe'; // Default PSOE para partidas existentes
            saveData.version = 9;
        }

        // Migración v9 → v10 (sistema de clicks dinámicos)
        if (saveData.version === 9) {
            saveData.gameState.clickVpsRatio = 0.02; // 2% base
            saveData.gameState.clickCritChance = 0;
            saveData.gameState.votosDesdeClicks = 0;
            saveData.gameState.totalClicks = 0;
            saveData.version = 10;
        }

        // Migración v10/v11 → v12 (sistema de venta de regiones)
        if (saveData.version === 10 || saveData.version === 11) {
            saveData.gameState.regionesVendidas = {};
            saveData.version = 12;
        }

        // Restaurar partidoElegido ANTES de restaurar gameState
        // (necesario para que los datos dinámicos se carguen correctamente)
        partidoElegido = saveData.partidoElegido || 'psoe';

        // Reinicializar todos los datos dinámicos para el partido guardado
        if (typeof initPartidos === 'function') initPartidos(partidoElegido);
        if (typeof initBuildingsData === 'function') initBuildingsData(partidoElegido);
        if (typeof initUpgradesData === 'function') initUpgradesData(partidoElegido);
        if (typeof initHeadlines === 'function') initHeadlines(partidoElegido);
        if (typeof initFrasesData === 'function') initFrasesData(partidoElegido);
        if (typeof initEventosData === 'function') initEventosData();

        // Restaurar gameState
        gameState.totalVotos = saveData.gameState.totalVotos || 0;
        gameState.egoPolitico = saveData.gameState.egoPolitico || 0;
        gameState.clickValue = saveData.gameState.clickValue || 1;
        gameState.tertulianoActive = saveData.gameState.tertulianoActive || false;
        gameState.correosActive = saveData.gameState.correosActive || false;
        gameState.indraBonus = saveData.gameState.indraBonus || 0;
        gameState.corrupcionActive = saveData.gameState.corrupcionActive || false;
        gameState.eventosCorrupcionSobrevividos = saveData.gameState.eventosCorrupcionSobrevividos || 0;
        gameState.decadenciaEventoActivo = saveData.gameState.decadenciaEventoActivo || false;
        gameState.deuda = saveData.gameState.deuda || 0;
        gameState.inflacion = saveData.gameState.inflacion || 0;
        // Campos v5
        gameState.viralEventsActivated = saveData.gameState.viralEventsActivated || 0;
        gameState.regionesPerdidas = saveData.gameState.regionesPerdidas || 0;
        gameState.deepfakeToolActive = saveData.gameState.deepfakeToolActive || false;
        gameState.prestigeLevel = saveData.gameState.prestigeLevel || 0;
        gameState.prestigeBonuses = saveData.gameState.prestigeBonuses || { vpsMultiplier: 1.0, costReduction: 1.0 };
        currentHeadlineIndex = saveData.currentHeadlineIndex || 0;
        // Campos v6 - Déficit y Reset Progresista
        gameState.deficit = saveData.gameState.deficit || 0;
        gameState.bonosVendidos = saveData.gameState.bonosVendidos || 0;
        gameState.resetProgresistaCount = saveData.gameState.resetProgresistaCount || 0;
        gameState.aiDifficultyReduction = saveData.gameState.aiDifficultyReduction || 0;
        // Campos v7 - Sistema de Ascensión
        gameState.castaAcumulada = saveData.gameState.castaAcumulada || 0;
        gameState.castaGastada = saveData.gameState.castaGastada || 0;
        gameState.ascensionCount = saveData.gameState.ascensionCount || 0;
        gameState.privilegiosComprados = saveData.gameState.privilegiosComprados || [];
        gameState.eliminatedRival = saveData.gameState.eliminatedRival || null;
        gameState.dificultadResetCount = saveData.gameState.dificultadResetCount || 0;
        // Campos v8 - Fase Gobierno
        gameState.gamePhase = saveData.gameState.gamePhase || 'campaign';
        gameState.governmentTimeLeft = saveData.gameState.governmentTimeLeft || 0;
        gameState.governmentStartVotos = saveData.gameState.governmentStartVotos || 0;
        gameState.governmentMinVotos = saveData.gameState.governmentMinVotos || 0;
        gameState.governmentCompleted = saveData.gameState.governmentCompleted || false;
        // Campos v10 - Sistema de Clicks Dinámicos
        gameState.clickVpsRatio = saveData.gameState.clickVpsRatio || 0.02;
        gameState.clickCritChance = saveData.gameState.clickCritChance || 0;
        gameState.votosDesdeClicks = saveData.gameState.votosDesdeClicks || 0;
        gameState.totalClicks = saveData.gameState.totalClicks || 0;
        // Campos v11 - Balance de upgrades
        gameState.campanaActive = saveData.gameState.campanaActive || false;
        gameState.monteroActive = saveData.gameState.monteroActive || false;
        gameState.euFundsActive = saveData.gameState.euFundsActive || false;
        gameState.euFundsStartTime = saveData.gameState.euFundsStartTime || 0;
        gameState.suscripcionBonus = saveData.gameState.suscripcionBonus || 0;
        gameState.zapateroBonus = saveData.gameState.zapateroBonus || 0;
        gameState.corruptionShield = saveData.gameState.corruptionShield || false;
        gameState.buildingsBonusMultiplier = saveData.gameState.buildingsBonusMultiplier || 0;
        // Campos v12 - Sistema de Venta de Regiones
        gameState.regionesVendidas = saveData.gameState.regionesVendidas || {};

        // Resincronizar buildings/upgrades con el partido guardado.
        // initGameState() los clonó con las variantes por defecto (PSOE);
        // tras initBuildingsData/initUpgradesData los globales ya apuntan al
        // partido correcto, así que reclonamos aquí antes de
        // initAscensionBuildings y de restaurar los valores guardados.
        gameState.buildings = {};
        gameState.upgrades = {};
        for (let key in buildingsData) {
            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 };
        }

        // Inicializar edificios de ascensión desbloqueados
        if (typeof initAscensionBuildings === 'function') {
            initAscensionBuildings();
        }

        // Restaurar edificios
        for (let key in saveData.gameState.buildings) {
            if (gameState.buildings[key]) {
                gameState.buildings[key].cost = saveData.gameState.buildings[key].cost;
                gameState.buildings[key].baseVps = saveData.gameState.buildings[key].baseVps;
                gameState.buildings[key].count = saveData.gameState.buildings[key].count;
            }
        }

        // Restaurar upgrades
        for (let key in saveData.gameState.upgrades) {
            if (gameState.upgrades[key]) {
                gameState.upgrades[key].bought = saveData.gameState.upgrades[key].bought;
            }
        }

        // Restaurar partidos
        for (let key in saveData.partidos) {
            if (partidos[key]) {
                partidos[key].votos = saveData.partidos[key].votos || 0;
                partidos[key].vps = saveData.partidos[key].vps || 0;
                if (saveData.partidos[key].growthRate !== null && !partidos[key].isPlayer) {
                    partidos[key].growthRate = saveData.partidos[key].growthRate;
                }
            }
        }

        // Restaurar logros
        for (let key in saveData.logros) {
            if (logros[key]) {
                logros[key].unlocked = saveData.logros[key].unlocked || false;
            }
        }

        // Migrar logros nuevos: marcar como unlocked sin dar premio si condición ya se cumple
        for (let key in logros) {
            if (!saveData.logros[key] && logros[key].condition()) {
                logros[key].unlocked = true;
            }
        }

        // Restaurar estadísticas (migración desde v3: inicializar a 0 si no existen)
        if (saveData.stats) {
            gameStats.votosHistoricos = saveData.stats.votosHistoricos || 0;
            gameStats.totalClicks = saveData.stats.totalClicks || 0;
            gameStats.tiempoJuegoMs = saveData.stats.tiempoJuegoMs || 0;
            gameStats.edificiosTotalesComprados = saveData.stats.edificiosTotalesComprados || 0;
            gameStats.upgradesDesbloqueados = saveData.stats.upgradesDesbloqueados || 0;
            gameStats.eventosEnfrentados = saveData.stats.eventosEnfrentados || 0;
            gameStats.vecesPrestigiado = saveData.stats.vecesPrestigiado || 0;
            gameStats.maxVotosAlcanzados = saveData.stats.maxVotosAlcanzados || 0;
        }

        // Restaurar estadísticas de sesión (valores por defecto si no existen)
        if (saveData.sessionStats) {
            sessionStats.clicks = saveData.sessionStats.clicks || 0;
            sessionStats.tiempoMs = saveData.sessionStats.tiempoMs || 0;
            sessionStats.edificiosComprados = saveData.sessionStats.edificiosComprados || 0;
            sessionStats.upgradesComprados = saveData.sessionStats.upgradesComprados || 0;
            sessionStats.eventosEnfrentados = saveData.sessionStats.eventosEnfrentados || 0;
        }

        // Mostrar bonificación de Reset Progresista o Ego según corresponda
        if (gameState.resetProgresistaCount > 0) {
            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}%)`;
        } else {
            const egoBonus = Math.min(gameState.egoPolitico * 10, 50);
            document.getElementById('ego-display').innerText = `Ego Político: ${gameState.egoPolitico} (Bonus: +${egoBonus}%)`;
        }
        if (gameState.totalVotos > 1000000) {
            document.getElementById('prestige-container').style.display = 'block';
        }

        // Mostrar botón de ascensión si ha ascendido antes
        if (gameState.ascensionCount > 0) {
            const ascensionBtn = document.getElementById('ascension-btn');
            if (ascensionBtn) {
                ascensionBtn.style.display = 'flex';
            }
        }

        return true;
    } catch (e) {
        console.error('[Persist] Error cargando, borrando datos:', e);
        localStorage.removeItem(SAVE_KEY);
        return false;
    }
}

function showSaveIndicator() {
    const indicator = document.getElementById('save-indicator');
    indicator.classList.add('visible');
    setTimeout(() => indicator.classList.remove('visible'), 1500);
    
    // Anunciar para screen readers
    if (typeof announceToSR === 'function') {
        announceToSR('Partida guardada automáticamente');
    }
}

// Sincronizar con Capacitor Preferences si hay datos más recientes
async function syncFromCapacitorPreferences() {
    if (typeof loadGameDual !== 'function' || !CapacitorPersistence || !CapacitorPersistence.isCapacitor) {
        return false;
    }

    try {
        const prefsData = await loadGameDual();
        if (!prefsData) return false;

        // Comparar timestamps para ver si Preferences tiene datos más recientes
        const localSaved = localStorage.getItem(SAVE_KEY);
        const localData = localSaved ? JSON.parse(localSaved) : null;

        if (!localData || (prefsData.timestamp && (!localData.timestamp || prefsData.timestamp > localData.timestamp))) {
            console.log('[Persist] Sincronizando datos más recientes desde Capacitor Preferences');
            // Recargar el estado del juego con los datos de Preferences
            localStorage.setItem(SAVE_KEY, JSON.stringify(prefsData));
            loadGame();
            return true;
        }

        return false;
    } catch (e) {
        console.error('[Persist] Error sincronizando desde Preferences:', e);
        return false;
    }
}
