// La Paguita - Persistencia (Guardado/Carga)

let autoSaveTimer = null;
let _offlineProgress = null;

const MAX_OFFLINE_SECONDS = 28800; // 8 hours
const OFFLINE_EFFICIENCY = 0.5; // 50% of normal production

function saveGame() {
    if (!gameState) return;

    const saveData = {
        version: SAVE_VERSION,
        timestamp: Date.now(),
        state: gameState
    };

    try {
        localStorage.setItem(SAVE_KEY, JSON.stringify(saveData));
        mostrarIndicadorGuardado();
    } catch (e) {
        console.error('Error guardando:', e);
    }
}

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

        const saveData = JSON.parse(raw);

        if (saveData.version !== SAVE_VERSION) {
            console.warn('Versión de guardado incompatible, limpiando...');
            localStorage.removeItem(SAVE_KEY);
            return false;
        }

        gameState = saveData.state;

        // Backward compat: ensure trampas/debuffs exist for old saves
        if (!gameState.trampasActivadas) gameState.trampasActivadas = {};
        if (!gameState.debuffs) gameState.debuffs = [];

        // Backward compat: ensure hints exist for old saves
        if (!gameState.hints) {
            gameState.hints = {
                primeraPaguita: false,
                primeraAyuda: false,
                primeraAccion: false,
                alertaAlta: false,
                alertaPeligro: false,
                puedeAvanzar: false,
                primerCambioFase: false,
                primeraDerrota: false
            };
        }

        // Backward compat: minigame fields
        if (gameState.minijuegosActivos === undefined) gameState.minijuegosActivos = true;
        if (!gameState.stats.minijuegos) gameState.stats.minijuegos = { total: 0 };

        // Backward compat: ayuda cooldowns
        if (!gameState.cooldownsAyudas) gameState.cooldownsAyudas = {};

        // Backward compat: dificultad AFK (inspección + decay de ayudas)
        if (gameState.ultimaInteraccion == null) gameState.ultimaInteraccion = gameState.ticksTotales || 0;
        if (gameState.ultimaInspeccionAFK == null) gameState.ultimaInspeccionAFK = 0;
        if (!gameState.ayudasRenovacion) gameState.ayudasRenovacion = {};
        if (!gameState.ayudasCongeladas) gameState.ayudasCongeladas = {};
        for (const id of Object.keys(gameState.ayudasActivas || {})) {
            if (gameState.ayudasRenovacion[id] == null) gameState.ayudasRenovacion[id] = gameState.ticksTotales || 0;
        }

        // Calculate offline progress
        _offlineProgress = calcularProgresoOffline(saveData.timestamp);

        return true;
    } catch (e) {
        console.error('Error cargando:', e);
        return false;
    }
}

function deleteSave() {
    localStorage.removeItem(SAVE_KEY);
}

function startAutoSave() {
    if (autoSaveTimer) clearInterval(autoSaveTimer);
    autoSaveTimer = setInterval(() => {
        if (gameState && gameState.juegoIniciado && !gameState.juegoTerminado) {
            saveGame();
        }
    }, AUTO_SAVE_INTERVAL);
}

function setupVisibilityAutoSave() {
    document.addEventListener('visibilitychange', () => {
        if (document.hidden && gameState && gameState.juegoIniciado) {
            saveGame();
        }
    });

    // Save on app close/navigate away (critical for mobile browsers killing tabs)
    window.addEventListener('pagehide', () => {
        if (gameState && gameState.juegoIniciado) {
            saveGame();
        }
    });
}

function calcularProgresoOffline(savedTimestamp) {
    if (!gameState || !savedTimestamp) return null;
    if (gameState.juegoTerminado || !gameState.juegoIniciado) return null;

    const elapsedMs = Date.now() - savedTimestamp;
    const elapsedSeconds = Math.min(elapsedMs / 1000, MAX_OFFLINE_SECONDS);

    // Need at least 60 seconds away to count
    if (elapsedSeconds < 60) return null;

    // Calculate production rates
    calcularProduccion();
    const vps = gameState.vps;
    const dps = gameState.dps;
    const pps = gameState.pps;

    if (vps <= 0) return null; // Nothing to gain

    const paguitas = Math.floor(vps * elapsedSeconds * OFFLINE_EFFICIENCY);
    const drenaje = dps * elapsedSeconds * OFFLINE_EFFICIENCY;
    const poblacion = Math.floor(pps * elapsedSeconds * OFFLINE_EFFICIENCY);

    // Apply
    gameState.paguitas += paguitas;
    gameState.totalPaguitasGeneradas += paguitas;
    gameState.presupuestoEspanol = Math.max(0, gameState.presupuestoEspanol - drenaje);
    gameState.poblacionInmigrante += poblacion;

    return {
        elapsedSeconds: Math.floor(elapsedSeconds),
        paguitas: paguitas,
        drenaje: drenaje,
        poblacion: poblacion
    };
}

function getOfflineProgress() {
    const prog = _offlineProgress;
    _offlineProgress = null;
    return prog;
}

function mostrarIndicadorGuardado() {
    const indicator = document.getElementById('save-indicator');
    if (!indicator) return;

    indicator.classList.add('show');
    setTimeout(() => {
        indicator.classList.remove('show');
    }, 1500);
}
