// Resistiré - Estado del Juego

let gameState = null;

function initGameState(personaje = null) {
    const char = personaje || getPersonajeSeleccionado() || personajesData.asesor;

    gameState = {
        // Info del jugador
        playerName: char.nombre || 'El Asesor',
        personajeId: char.id || 'asesor',

        // Sistema temporal (olaIndex/semanaIndex internamente reusan los nombres de Boomermania)
        decadaIndex: 0,         // Índice de ola (0-5)
        añoIndex: 0,            // Índice de semana dentro de la ola (0-1)
        accionesAño: 0,         // Acciones realizadas en la semana actual
        maxAccionesPorAño: ESTRUCTURA_TEMPORAL.accionesPorAño,

        // Recursos personales (Moncloa)
        playerResources: {
            popularidad: 35,
            relato: 50,
            enchufes: 0,
            socios: 60,
            ego: 30
        },

        // Recursos globales (España): 100 = sano, 0 = destruido
        recursosGlobales: {
            sanidadDisponible: 100,
            economia: 100,
            libertades: 100,
            saludPoblacional: 100,
            vidasSalvadas: 100
        },

        mejorasUsadas: [],
        eventosVistos: [],

        // Puntuación
        puntuacionBienestar: 0,
        puntuacionMiseria: 0,
        puntuacionTotal: 0,

        juegoTerminado: false,
        juegoIniciado: false,
        runStartedAt: Date.now(),

        stats: {
            accionesTotales: 0,
            eventosResueltos: 0,
            añosJugados: 0,
            decadasCompletadas: 0
        }
    };

    if (char.bonus) {
        aplicarBonusPersonaje(char.bonus);
    }

    return gameState;
}

function aplicarBonusPersonaje(bonus) {
    if (!bonus || !gameState) return;

    if (bonus.relato) gameState.playerResources.relato += bonus.relato;
    if (bonus.popularidad) gameState.playerResources.popularidad += bonus.popularidad;
    if (bonus.enchufes) gameState.playerResources.enchufes += bonus.enchufes;
    if (bonus.socios) gameState.playerResources.socios += bonus.socios;
    if (bonus.ego) gameState.playerResources.ego += bonus.ego;

    if (bonus.saludPoblacionalInicial) {
        // El Tecnócrata empieza con menos contagios → más salud
        gameState.recursosGlobales.saludPoblacional = Math.min(100, 100 + bonus.saludPoblacionalInicial);
    }
}

// La "década" en realidad es la ola (mantenemos el nombre por compatibilidad)
function getDecadaActual() {
    if (!gameState || gameState.decadaIndex >= DECADAS.length) return null;
    return DECADAS[gameState.decadaIndex];
}

function getPeriodoAñoActual() {
    const decada = getDecadaActual();
    if (!decada || !decada.años) return null;
    const añoIndex = gameState.añoIndex || 0;
    return decada.años[Math.min(añoIndex, decada.años.length - 1)];
}

// Devuelve el número de ola (1-6) para indexar mejoras y eventos
function getAnoActual() {
    const decada = getDecadaActual();
    return decada ? decada.year : 1;
}

function getRangoAñosActual() {
    const decada = getDecadaActual();
    if (!decada) return 'Fin';
    return `OLA ${gameState.decadaIndex + 1} · ${decada.playerAge}`;
}

function getNombrePeriodoActual() {
    const periodo = getPeriodoAñoActual();
    return periodo ? periodo.nombre : '';
}

function isJuegoTerminado() {
    return gameState && gameState.juegoTerminado;
}

// Calcular puntuación
function calcularPuntuacion() {
    if (!gameState) return 0;

    const bienestar = calcularBienestar(gameState.playerResources);
    const caos = calcularMiseriaGeneracional(gameState.recursosGlobales);

    gameState.puntuacionBienestar = bienestar;
    gameState.puntuacionMiseria = caos;

    const factorCaos = 1 + (caos / 100);
    const penalizacionExtrema = caos > 80 ? (caos - 80) * 2 : 0;
    const bonusEquilibrio = (caos >= 40 && caos <= 70) ? 100 : 0;
    gameState.puntuacionTotal = Math.floor((bienestar * factorCaos) - penalizacionExtrema + bonusEquilibrio);

    return gameState.puntuacionTotal;
}

// Aplicar efectos
function aplicarEfectos(efectos) {
    if (!efectos || !gameState) return;

    if (efectos.playerResources) {
        for (const [recurso, cambio] of Object.entries(efectos.playerResources)) {
            if (gameState.playerResources[recurso] !== undefined) {
                gameState.playerResources[recurso] += cambio;
                // Limitar popularidad/relato/socios entre 0 y 100; ego/enchufes sin tope superior
                if (recurso === 'popularidad' || recurso === 'relato' || recurso === 'socios') {
                    gameState.playerResources[recurso] = Math.min(100, Math.max(0, gameState.playerResources[recurso]));
                } else {
                    gameState.playerResources[recurso] = Math.max(0, gameState.playerResources[recurso]);
                }
            }
        }
    }

    if (efectos.recursosGlobales) {
        for (const [recurso, cambio] of Object.entries(efectos.recursosGlobales)) {
            if (gameState.recursosGlobales[recurso] !== undefined) {
                gameState.recursosGlobales[recurso] += cambio;
                gameState.recursosGlobales[recurso] = Math.min(100, Math.max(0, gameState.recursosGlobales[recurso]));
            }
        }
    }

    calcularPuntuacion();
}

// Comprobar si una acción es ejecutable (coste + requisitos)
function puedeRealizarMejora(mejoraId) {
    const mejora = mejorasData[mejoraId];
    if (!mejora) return { ok: false, razon: 'No disponible' };
    if (!gameState) return { ok: false, razon: 'Sin partida' };

    // Coste en recursos personales
    if (mejora.coste) {
        for (const [r, c] of Object.entries(mejora.coste)) {
            if (r === 'dinero') continue;
            const actual = gameState.playerResources[r] || 0;
            if (actual < c) {
                return { ok: false, razon: `Necesitas ${c} ${r}` };
            }
        }
    }
    return { ok: true };
}

// Realizar una acción
function realizarMejora(mejoraId) {
    if (!gameState || gameState.juegoTerminado) return false;
    if (!quedanAcciones()) return false;

    const mejora = mejorasData[mejoraId];
    if (!mejora) return false;

    const check = puedeRealizarMejora(mejoraId);
    if (!check.ok) return false;

    // Descontar coste en recursos personales
    if (mejora.coste) {
        for (const [r, c] of Object.entries(mejora.coste)) {
            if (r === 'dinero') continue;
            if (gameState.playerResources[r] !== undefined) {
                gameState.playerResources[r] -= c;
                if (r === 'popularidad' || r === 'relato' || r === 'socios') {
                    gameState.playerResources[r] = Math.max(0, gameState.playerResources[r]);
                }
            }
        }
    }

    aplicarEfectos(mejora.efecto);

    if (!mejora.repeatable) {
        gameState.mejorasUsadas.push(mejoraId);
    }

    gameState.accionesAño++;
    gameState.stats.accionesTotales++;

    return true;
}

function quedanAcciones() {
    if (!gameState) return false;
    return gameState.accionesAño < gameState.maxAccionesPorAño;
}

function getAccionesRestantes() {
    if (!gameState) return 0;
    return gameState.maxAccionesPorAño - gameState.accionesAño;
}

function resetGameState() {
    initGameState();
}
