// La Paguita - Estado del Juego

let gameState = null;

function initGameState(personajeId) {
    const personaje = getPersonajeById(personajeId || 'mohamed');
    const esNativo = esPersonajeNativo(personaje);
    const empiezaFase2 = personaje.especial === 'empieza_fase_2';
    const empiezaFase3 = esNativo; // Todos los nativos empiezan en fase 3

    // Calcular fase y papeles iniciales
    let faseInicial = 1;
    let papelesIniciales = PAPELES_INICIALES;
    let mesInicial = 1;
    let paguitasIniciales = PAGUITAS_INICIALES;

    if (empiezaFase3) {
        faseInicial = 3;
        papelesIniciales = 25; // Ya tiene los papeles de las fases anteriores
        mesInicial = 36; // 3 "años" en España
        paguitasIniciales = personaje.paguitasIniciales || 30;
    } else if (empiezaFase2) {
        faseInicial = 2;
        papelesIniciales = 10;
        mesInicial = 12;
    }

    gameState = {
        // Meta
        juegoIniciado: false,
        juegoTerminado: false,
        victoria: false,
        personajeId: personaje.id,
        runStartedAt: Date.now(),

        // Tiempo y Progreso
        mesActual: mesInicial,
        faseActual: faseInicial,
        ticksTotales: 0,

        // Recursos principales
        paguitas: paguitasIniciales,
        papeles: papelesIniciales,
        totalPaguitasGeneradas: 0,

        // Presupuesto español (drenar a 0 = victoria parcial)
        presupuestoEspanol: PRESUPUESTO_INICIAL,

        // Población
        poblacionNativa: POBLACION_NATIVA_INICIAL,
        poblacionInmigrante: personaje.especial === 'familia_inicial' ? 3 : POBLACION_INMIGRANTE_INICIAL,

        // Nivel de vida comparativo
        nivelVidaJugador: 10,
        nivelVidaEspanolito: NIVEL_VIDA_ESPANOLITO_INICIAL,

        // Alerta mediática (riesgo)
        alertaMediatica: ALERTA_MEDIATICA_INICIAL,
        maxAlertaAlcanzada: 0,

        // Ayudas activas: { ayudaId: nivel }
        ayudasActivas: {},

        // Renovación de ayudas: { ayudaId: tickDeUltimaRenovacion }
        ayudasRenovacion: {},

        // Ayudas congeladas por falta de renovación: { ayudaId: true }
        ayudasCongeladas: {},

        // Cooldowns de acciones: { accionId: trimestresRestantes }
        cooldowns: {},

        // Cooldowns de ayudas (trámite burocrático): { ayudaId: ticksRestantes }
        cooldownsAyudas: {},

        // Dificultad AFK
        ultimaInteraccion: 0,       // tickTotales de la última acción manual
        ultimaInspeccionAFK: 0,     // tickTotales de la última inspección AFK

        // Acciones realizadas (para logros)
        accionesRealizadas: [],

        // Producción por segundo (calculada)
        vps: 0, // Paguitas por segundo
        dps: 0, // Drenaje de presupuesto por segundo
        pps: 0, // Población por segundo
        papps: 0, // Papeles por segundo

        // Logros obtenidos
        logrosObtenidos: [],

        // Stats
        stats: {
            ayudasReclamadas: 0,
            eventosVistos: 0,
            accionesEjecutadas: 0,
            mesesSobrevividos: 0,
            maxPaguitas: 0,
            vecesDeportadoCasi: 0,
            totalPresupuestoDrenado: 0,
            totalPoblacionTraida: 0,
            minijuegos: {
                total: 0
            }
        },

        // MENA especial (nativos no tienen inmunidad, pero su "deportación" es distinta)
        inmunidadDeportacion: personaje.especial === 'mena_protegido' ? 3 : 0,

        // Trampas activadas (para no repetir)
        trampasActivadas: {},

        // Debuffs activos (penalizaciones permanentes)
        debuffs: [],

        // Minijuegos
        minijuegosActivos: true,

        // Hints (onboarding - cada uno se muestra una sola vez)
        hints: {
            primeraPaguita: false,
            primeraAyuda: false,
            primeraAccion: false,
            alertaAlta: false,
            alertaPeligro: false,
            puedeAvanzar: false,
            primerCambioFase: false,
            primeraDerrota: false
        }
    };

    return gameState;
}

function getFaseActual() {
    return FASES[gameState.faseActual - 1] || FASES[0];
}

function getMesInfo() {
    return `Mes ${gameState.mesActual}`;
}

function getPersonajeActual() {
    return getPersonajeById(gameState.personajeId);
}

function calcularProduccion() {
    const personaje = getPersonajeActual();
    let produccionTotal = 0;
    let drenajeTotal = 0;
    let poblacionTotal = 0;
    let papelesTotal = 0;
    let multiplicadorGlobal = 1;

    // Calcular producción de ayudas activas
    for (const [ayudaId, nivel] of Object.entries(gameState.ayudasActivas)) {
        const ayuda = getAyudaById(ayudaId);
        if (!ayuda) continue;

        // Si la ayuda está congelada por falta de renovación, no produce nada
        if (gameState.ayudasCongeladas && gameState.ayudasCongeladas[ayudaId]) continue;

        const produccionAyuda = ayuda.produccion + (ayuda.mejoraPorNivel * (nivel - 1));
        produccionTotal += produccionAyuda;
        drenajeTotal += ayuda.drenaPresupuesto * nivel;

        if (ayuda.bonusPoblacion) {
            poblacionTotal += ayuda.bonusPoblacion * nivel;
        }

        if (ayuda.bonusPapeles) {
            papelesTotal += ayuda.bonusPapeles; // flat per ayuda, not per level
        }

        if (ayuda.multiplicador) {
            multiplicadorGlobal *= ayuda.multiplicador;
        }
    }

    // Aplicar bonus de personaje
    produccionTotal *= personaje.bonus.paguitas;
    poblacionTotal *= personaje.bonus.poblacion;
    papelesTotal *= personaje.bonus.papeles;

    // Aplicar multiplicador global (de asociación cultural, etc)
    produccionTotal *= multiplicadorGlobal;

    // Aplicar debuffs de trampas
    if (gameState.debuffs && gameState.debuffs.length > 0) {
        for (const debuff of gameState.debuffs) {
            if (debuff.reduccionVps) {
                produccionTotal *= (1 - debuff.reduccionVps);
            }
            if (debuff.drenajeExtra) {
                drenajeTotal += debuff.drenajeExtra;
            }
        }
    }

    // Multiplicador temporal (de fundar_asociacion, etc.)
    if (gameState.multiplicadorTemporal && gameState.multiplicadorTemporal > 1) {
        if (gameState.ticksTotales < gameState.multiplicadorTemporalExpira) {
            produccionTotal *= gameState.multiplicadorTemporal;
        } else {
            gameState.multiplicadorTemporal = 1;
        }
    }

    gameState.vps = produccionTotal;
    gameState.dps = drenajeTotal;
    gameState.pps = Math.floor(poblacionTotal);
    gameState.papps = papelesTotal;

    return {
        produccion: gameState.vps,
        drenaje: gameState.dps,
        poblacion: gameState.pps
    };
}

function aplicarProduccion(deltaFactor) {
    calcularProduccion();

    // deltaFactor = real fraction of a second (default to 1/TICKS_POR_SEGUNDO for backward compat)
    const factor = deltaFactor || (1 / TICKS_POR_SEGUNDO);

    // Añadir paguitas (por tick)
    const paguitasTick = gameState.vps * factor;
    gameState.paguitas += paguitasTick;
    gameState.totalPaguitasGeneradas += paguitasTick;

    // Drenar presupuesto (por tick)
    const drenajeTick = gameState.dps * factor;
    gameState.presupuestoEspanol = Math.max(0, gameState.presupuestoEspanol - drenajeTick);

    // Añadir población (por tick)
    const poblacionTick = gameState.pps * factor;
    gameState.poblacionInmigrante += poblacionTick;

    // Añadir papeles pasivos (por tick)
    const papelesTick = gameState.papps * factor;
    gameState.papeles += papelesTick;

    // Reducir población nativa (emigración + baja natalidad, aprox 0.005% por mes)
    const emigracionNativaTick = (gameState.poblacionNativa * 0.00005) * factor;
    gameState.poblacionNativa = Math.max(10000000, gameState.poblacionNativa - emigracionNativaTick);

    // Stats
    gameState.stats.maxPaguitas = Math.max(gameState.stats.maxPaguitas, gameState.paguitas);
    gameState.stats.totalPresupuestoDrenado = PRESUPUESTO_INICIAL - gameState.presupuestoEspanol;
    gameState.stats.totalPoblacionTraida = Math.floor(gameState.poblacionInmigrante - 1);
    gameState.stats.mesesSobrevividos = gameState.mesActual;
}

function actualizarNivelVida() {
    // Nivel de vida del jugador: basado en paguitas acumuladas + ayudas activas
    const numAyudas = Object.keys(gameState.ayudasActivas).length;
    const basePaguitas = Math.min(50, Math.floor(gameState.paguitas / 100));
    const baseAyudas = numAyudas * 5;
    gameState.nivelVidaJugador = Math.min(100, 10 + basePaguitas + baseAyudas);

    // Nivel de vida del Españolito: baja con el tiempo y el presupuesto drenado
    const decayTiempo = (gameState.ticksTotales / TICKS_POR_SEGUNDO) * DECAY_ESPANOLITO;
    const decayPresupuesto = (PRESUPUESTO_INICIAL - gameState.presupuestoEspanol) * 0.3;
    gameState.nivelVidaEspanolito = Math.max(5, NIVEL_VIDA_ESPANOLITO_INICIAL - decayTiempo - decayPresupuesto);
}

function calcularPuntuacion() {
    let score = 0;

    // Paguitas acumuladas
    score += Math.floor(gameState.totalPaguitasGeneradas / 10);

    // Presupuesto drenado
    score += Math.floor((PRESUPUESTO_INICIAL - gameState.presupuestoEspanol) * 10);

    // Población traída
    score += Math.floor(gameState.poblacionInmigrante / 100000);

    // Bonus por victoria
    if (gameState.victoria) score += 500;

    // Bonus por diferencia nivel de vida
    const diff = gameState.nivelVidaJugador - gameState.nivelVidaEspanolito;
    if (diff > 0) score += diff * 10;

    // Bonus por ayudas activas
    score += Object.keys(gameState.ayudasActivas).length * 20;

    return score;
}

function getRating(score) {
    let rating = RATINGS[0];
    for (const r of RATINGS) {
        if (score >= r.minScore) rating = r;
    }
    return rating;
}
