// La Paguita - Sistema de Tiempo

// La Paguita - Sistema de Tiempo y Loop Principal

function gameTick(deltaMs) {
    if (!gameState || gameState.juegoTerminado) return false;

    // Cap deltaMs to prevent big jumps when tab is backgrounded
    deltaMs = Math.min(deltaMs || TICK_RATE_MS, 1000);
    const deltaFactor = deltaMs / 1000; // Fraction of a second

    gameState.ticksTotales++;

    // 1 mes = 3 segundos reales (30 ticks). El contador es narrativo;
    // la alerta pasiva y la deportación corren por segundo para preservar el balance.
    const esFinDeSegundo = (gameState.ticksTotales % TICKS_POR_SEGUNDO) === 0;
    const esFinDeMes = (gameState.ticksTotales % TICKS_POR_MES) === 0;

    // Aplicar producción continua (delta-time aware)
    aplicarProduccion(deltaFactor);

    // Actualizar niveles de vida
    actualizarNivelVida();

    // Alerta mediática: NO baja automáticamente. Solo con acciones del jugador.

    // Reducir cooldowns de acciones (1 per tick, not delta-time since they're in ticks)
    for (const accionId in gameState.cooldowns) {
        gameState.cooldowns[accionId]--;
        if (gameState.cooldowns[accionId] <= 0) {
            delete gameState.cooldowns[accionId];
        }
    }

    // Reducir cooldowns de ayudas (trámite burocrático)
    if (gameState.cooldownsAyudas) {
        for (const ayudaId in gameState.cooldownsAyudas) {
            gameState.cooldownsAyudas[ayudaId]--;
            if (gameState.cooldownsAyudas[ayudaId] <= 0) {
                delete gameState.cooldownsAyudas[ayudaId];
            }
        }
    }

    // Inmunidad MENA decrece con fases
    if (gameState.inmunidadDeportacion > 0 && gameState.faseActual >= 3) {
        gameState.inmunidadDeportacion = 0;
    }

    // Balance por segundo: alerta pasiva + chequeo de deportación
    if (esFinDeSegundo) {
        if (typeof DIFICULTAD_AFK_ACTIVA !== 'undefined' && DIFICULTAD_AFK_ACTIVA.alertaPasiva) {
            let nivelesActivosFase2Plus = 0;
            for (const [id, nivel] of Object.entries(gameState.ayudasActivas)) {
                if (gameState.ayudasCongeladas && gameState.ayudasCongeladas[id]) continue;
                const a = getAyudaById(id);
                if (a && a.fase >= 2) nivelesActivosFase2Plus += nivel;
            }
            if (nivelesActivosFase2Plus > 0) {
                let alertaPasiva = ALERTA_PASIVA_POR_NIVEL * nivelesActivosFase2Plus;
                const pers = getPersonajeActual();
                if (pers && pers.especial === 'nativo_viogen') alertaPasiva *= 0.5;
                if (pers && pers.especial === 'nativo_enchufada') alertaPasiva *= 0.8;
                gameState.alertaMediatica = Math.min(ALERTA_MAX, gameState.alertaMediatica + alertaPasiva);
                gameState.maxAlertaAlcanzada = Math.max(gameState.maxAlertaAlcanzada, gameState.alertaMediatica);
            }
        }

        if (gameState.alertaMediatica >= DERROTA_DEPORTACION_ALERTA && gameState.inmunidadDeportacion <= 0 && !gameState.inmunidadPolitica) {
            return procesarDeportacion();
        }
    }

    if (esFinDeMes) {
        gameState.mesActual++;
    }

    // Trampas automáticas: comprobar cada 15 segundos (150 ticks)
    const esCheckTrampa = (gameState.ticksTotales % (TICKS_POR_SEGUNDO * 15)) === 0;
    if (esCheckTrampa) {
        const trampa = getTrampaAutoDisparable();
        if (trampa) {
            activarTrampaAuto(trampa);
            return 'trampa_auto';
        }
    }

    // Inspección AFK: comprobar cada segundo
    if (typeof DIFICULTAD_AFK_ACTIVA !== 'undefined' && DIFICULTAD_AFK_ACTIVA.inspeccionAFK && (gameState.ticksTotales % TICKS_POR_SEGUNDO) === 0) {
        const inspeccion = checkInspeccionAFK();
        if (inspeccion) return 'inspeccion_afk';
    }

    // Decay de ayudas: comprobar cada 10s (100 ticks)
    if (typeof DIFICULTAD_AFK_ACTIVA !== 'undefined' && DIFICULTAD_AFK_ACTIVA.decayAyudas && (gameState.ticksTotales % 100) === 0) {
        checkDecayAyudas();
    }

    // Eventos y frases: comprobar solo cada 30 segundos reales (300 ticks)
    const esCheckEvento = (gameState.ticksTotales % (TICKS_POR_SEGUNDO * 30)) === 0;
    if (esCheckEvento) {
        // 30% de probabilidad de evento aleatorio
        if (Math.random() < 0.30) {
            return 'evento_aleatorio';
        }
        // 20% de probabilidad de frase del jugador
        else if (Math.random() < 0.20) {
            return 'frase_jugador';
        }
    }

    // Verificar victoria constantemente
    if (checkVictoria()) {
        gameState.juegoTerminado = true;
        gameState.victoria = true;
        return 'victoria';
    }

    return 'ok';
}

function procesarDeportacion() {
    gameState.stats.vecesDeportadoCasi++;
    const personaje = getPersonajeActual();
    const esNativo = esPersonajeNativo(personaje);
    const escapeCount = gameState.stats.vecesDeportadoCasi;

    // Que esto es España, aquí no pasa nada: the player NEVER actually loses.
    // Penalties escalate with each escape to maintain difficulty.

    if (esNativo) {
        const alertaFloor = Math.min(80, 55 + (escapeCount * 5));
        gameState.alertaMediatica = alertaFloor;

        const paguitaLoss = Math.min(0.80, 0.40 + (escapeCount * 0.10));
        gameState.paguitas = Math.max(0, gameState.paguitas * (1 - paguitaLoss));
    } else {
        const alertaFloor = Math.min(85, 65 + (escapeCount * 5));
        gameState.alertaMediatica = alertaFloor;

        const paguitaLoss = Math.min(0.60, Math.max(0, (escapeCount - 1) * 0.15));
        if (paguitaLoss > 0) {
            gameState.paguitas = Math.max(0, gameState.paguitas * (1 - paguitaLoss));
        }
    }

    // From the 4th escape, lose a random ayuda level
    if (escapeCount >= 4) {
        const ayudaIds = Object.keys(gameState.ayudasActivas);
        if (ayudaIds.length > 0) {
            const randomId = ayudaIds[Math.floor(Math.random() * ayudaIds.length)];
            gameState.ayudasActivas[randomId]--;
            if (gameState.ayudasActivas[randomId] <= 0) {
                delete gameState.ayudasActivas[randomId];
            }
        }
    }

    return 'casi_deportado';
}

function checkVictoria() {
    // Victoria: drenar presupuesto a 0 O superar población nativa
    const presupuestoDrenado = gameState.presupuestoEspanol <= VICTORIA_PRESUPUESTO;
    const poblacionSuperada = gameState.poblacionInmigrante >= gameState.poblacionNativa;

    return (presupuestoDrenado || poblacionSuperada) && gameState.faseActual === TOTAL_FASES;
}

function avanzarFase() {
    const faseActualObj = getFaseActual();
    const siguienteFase = FASES[gameState.faseActual]; // index es faseActual porque id es 1-based

    if (siguienteFase && gameState.papeles >= siguienteFase.papelesRequeridos) {
        gameState.papeles -= siguienteFase.papelesRequeridos;
        gameState.faseActual++;
        return 'nueva_fase';
    }
    return false;
}

function getProgresoFase() {
    const siguienteFase = FASES[gameState.faseActual];
    if (!siguienteFase) return 1; // Fase final
    
    // Progreso basado en los papeles actuales respecto a los requeridos
    return Math.min(1, gameState.papeles / siguienteFase.papelesRequeridos);
}

function getProgresoTotal() {
    return gameState.faseActual / TOTAL_FASES;
}

function checkDecayAyudas() {
    if (!gameState || !gameState.ayudasActivas) return;
    if (!gameState.ayudasRenovacion) gameState.ayudasRenovacion = {};
    if (!gameState.ayudasCongeladas) gameState.ayudasCongeladas = {};

    for (const ayudaId of Object.keys(gameState.ayudasActivas)) {
        if (gameState.ayudasCongeladas[ayudaId]) continue;
        const last = gameState.ayudasRenovacion[ayudaId];
        if (last == null) {
            gameState.ayudasRenovacion[ayudaId] = gameState.ticksTotales;
            continue;
        }
        if ((gameState.ticksTotales - last) >= AYUDA_DECAY_TICKS) {
            gameState.ayudasCongeladas[ayudaId] = true;
        }
    }
}

function checkInspeccionAFK() {
    if (!gameState) return false;
    if ((gameState.ticksTotales - (gameState.ultimaInteraccion || 0)) < INSPECCION_AFK_UMBRAL_TICKS) return false;
    if (gameState.alertaMediatica <= INSPECCION_AFK_ALERTA_MINIMA) return false;
    if ((gameState.ticksTotales - (gameState.ultimaInspeccionAFK || 0)) < INSPECCION_AFK_COOLDOWN_TICKS) return false;

    // Mari Carmen inmune a inspección (ya lo es para el resto del juego)
    const personaje = getPersonajeActual();
    if (personaje && personaje.especial === 'nativo_viogen') return false;

    // Inmunidad política anula la inspección también
    if (gameState.inmunidadPolitica) return false;

    const pct = INSPECCION_AFK_PAGUITAS_MIN + Math.random() * (INSPECCION_AFK_PAGUITAS_MAX - INSPECCION_AFK_PAGUITAS_MIN);
    const perdida = Math.floor(gameState.paguitas * pct);
    gameState.paguitas = Math.max(0, gameState.paguitas - perdida);
    gameState.alertaMediatica = Math.min(ALERTA_MAX, gameState.alertaMediatica + INSPECCION_AFK_ALERTA);
    gameState.maxAlertaAlcanzada = Math.max(gameState.maxAlertaAlcanzada, gameState.alertaMediatica);
    gameState.ultimaInspeccionAFK = gameState.ticksTotales;
    return { perdida };
}
