// La Paguita - Sistema Económico

function comprarAyuda(ayudaId) {
    if (!gameState) return null;

    gameState.ultimaInteraccion = gameState.ticksTotales;

    const ayuda = getAyudaById(ayudaId);
    if (!ayuda) return null;

    // Verificar fase
    if (ayuda.fase > gameState.faseActual) return null;

    // Use getEstadoAyuda for comprehensive check
    const estado = getEstadoAyuda(ayuda);
    if (estado.estado !== 'disponible') return null;

    const { costePaguitas, costePapeles, probAprobacion } = estado;
    const nivelActual = gameState.ayudasActivas[ayudaId] || 0;

    // Pay cost (always deducted, even on rejection)
    gameState.paguitas -= costePaguitas;
    // Papeles only consumed partially on rejection
    gameState.papeles -= costePapeles;

    // Set cooldown for this ayuda
    if (!gameState.cooldownsAyudas) gameState.cooldownsAyudas = {};
    const cooldown = ayuda.cooldownCompra || 30;
    gameState.cooldownsAyudas[ayudaId] = cooldown;

    // Roll for approval
    const aprobado = Math.random() < probAprobacion;

    if (!aprobado) {
        // Rejected - refund half the papeles, keep the paguitas lost
        const papelesDevueltos = Math.floor(costePapeles * 0.5);
        gameState.papeles += papelesDevueltos;

        // Extra cooldown on rejection (50% more wait)
        gameState.cooldownsAyudas[ayudaId] = Math.ceil(cooldown * 1.5);

        // Slight alert increase from the attempt
        gameState.alertaMediatica = Math.min(ALERTA_MAX, gameState.alertaMediatica + 1);

        gameState.stats.ayudasReclamadas++;
        return {
            tipo: 'rechazado',
            ayuda: ayuda,
            coste: { paguitas: costePaguitas, papeles: costePapeles - papelesDevueltos },
            cooldown: gameState.cooldownsAyudas[ayudaId],
            probAprobacion: probAprobacion
        };
    }

    // Approved - activate/upgrade
    gameState.ayudasActivas[ayudaId] = nivelActual + 1;

    // Reset renovación (ayuda recién aprobada tiene los papeles al día)
    if (!gameState.ayudasRenovacion) gameState.ayudasRenovacion = {};
    if (!gameState.ayudasCongeladas) gameState.ayudasCongeladas = {};
    gameState.ayudasRenovacion[ayudaId] = gameState.ticksTotales;
    delete gameState.ayudasCongeladas[ayudaId];

    // Alert from purchase
    if (ayuda.subeAlerta) {
        gameState.alertaMediatica = Math.min(ALERTA_MAX, gameState.alertaMediatica + ayuda.subeAlerta);
    }
    gameState.alertaMediatica = Math.min(ALERTA_MAX, gameState.alertaMediatica + 2);

    // Stats
    gameState.stats.ayudasReclamadas++;

    // Recalculate production
    calcularProduccion();

    return {
        tipo: 'aprobado',
        ayuda: ayuda,
        coste: { paguitas: costePaguitas, papeles: costePapeles },
        nivelNuevo: nivelActual + 1
    };
}

function costeRenovacionAyuda(ayuda) {
    if (!ayuda) return 1;
    return Math.max(1, Math.ceil((ayuda.fase || 1) * 0.5));
}

function renovarAyuda(ayudaId) {
    if (!gameState) return null;
    const ayuda = getAyudaById(ayudaId);
    if (!ayuda) return null;
    if (!gameState.ayudasActivas[ayudaId]) return null;

    const coste = costeRenovacionAyuda(ayuda);
    if (gameState.papeles < coste) {
        return { ok: false, motivo: 'sin_papeles', coste };
    }

    gameState.ultimaInteraccion = gameState.ticksTotales;
    gameState.papeles -= coste;
    if (!gameState.ayudasRenovacion) gameState.ayudasRenovacion = {};
    if (!gameState.ayudasCongeladas) gameState.ayudasCongeladas = {};
    gameState.ayudasRenovacion[ayudaId] = gameState.ticksTotales;
    delete gameState.ayudasCongeladas[ayudaId];

    calcularProduccion();
    return { ok: true, coste };
}

function ejecutarAccion(accionId) {
    if (!gameState) return null;

    gameState.ultimaInteraccion = gameState.ticksTotales;

    const accion = getAccionById(accionId);
    if (!accion) return null;

    // Verificar fase
    if (accion.fase > gameState.faseActual) return null;

    // Verificar cooldown
    if (gameState.cooldowns[accionId] && gameState.cooldowns[accionId] > 0) return null;

    // Verificar coste
    if (gameState.paguitas < accion.costePaguitas) return null;
    if (accion.costePapeles && gameState.papeles < accion.costePapeles) return null;

    // Pagar coste
    gameState.paguitas -= accion.costePaguitas;
    if (accion.costePapeles) gameState.papeles -= accion.costePapeles;

    const personaje = getPersonajeActual();
    let resultado = {
        accion: accion,
        exito: true,
        mensaje: '',
        efectos: {}
    };

    // Minijuegos: map action IDs to minigame types
    const ACCION_MINIJUEGO_MAP = {
        'top_manta': 'top_manta',
        'cola_extranjeria': 'cola_extranjeria',
        'carterista_metro': 'carterista_metro',
        'llorar_en_juzgado': 'drama_juzgado',
        'baja_medica': 'baja_medica',
        'trapicheo_mercadillo': 'trapicheo_mercadillo',
        'tiktok_llantina': 'tiktok_viral',
        'estafa_forocochero': 'estafa_forocochero',
    };
    const minijuegoTipo = ACCION_MINIJUEGO_MAP[accion.id];
    if (gameState.minijuegosActivos && minijuegoTipo) {
        // Apply cooldown and alert now, but delegate resolution to minigame
        const alertaAccion = _calcularAlertaAccion(accion, personaje);
        gameState.alertaMediatica = Math.max(0, Math.min(ALERTA_MAX, gameState.alertaMediatica + alertaAccion));
        gameState.maxAlertaAlcanzada = Math.max(gameState.maxAlertaAlcanzada, gameState.alertaMediatica);
        if (accion.cooldown > 0) gameState.cooldowns[accionId] = accion.cooldown;
        if (!gameState.accionesRealizadas.includes(accionId)) gameState.accionesRealizadas.push(accionId);
        gameState.stats.accionesEjecutadas++;
        return {
            accion: accion,
            tipo: 'minijuego',
            minijuego: minijuegoTipo,
            accionOriginal: accion
        };
    }

    // Verificar riesgo
    if (accion.riesgo && Math.random() < accion.riesgo.probabilidad) {
        // If minigames active, offer escape chance via QTE
        if (gameState.minijuegosActivos) {
            const alertaAccion = _calcularAlertaAccion(accion, personaje);
            gameState.alertaMediatica = Math.max(0, Math.min(ALERTA_MAX, gameState.alertaMediatica + alertaAccion));
            gameState.maxAlertaAlcanzada = Math.max(gameState.maxAlertaAlcanzada, gameState.alertaMediatica);
            if (accion.cooldown > 0) gameState.cooldowns[accionId] = accion.cooldown;
            if (!gameState.accionesRealizadas.includes(accionId)) gameState.accionesRealizadas.push(accionId);
            gameState.stats.accionesEjecutadas++;
            return {
                accion: accion,
                tipo: 'minijuego',
                minijuego: 'huye_policia',
                penalidad: {
                    paguitas: -(accion.riesgo.cantidad || 0),
                    mensaje: `¡Pillado! ${accion.riesgo.tipo === 'multa' ? 'Te han multado.' : 'Te han echado.'}`,
                    penalizacion: accion.riesgo.penalizacion
                }
            };
        }

        resultado.exito = false;
        resultado.mensaje = `¡Pillado! ${accion.riesgo.tipo === 'multa' ? 'Te han multado.' : 'Te han echado.'}`;
        resultado.efectos.paguitas = -(accion.riesgo.cantidad || 0);
        gameState.paguitas = Math.max(0, gameState.paguitas + resultado.efectos.paguitas);

        if (accion.riesgo.penalizacion === 'perder_vivienda_temp') {
            resultado.mensaje += ' Has perdido la vivienda temporal.';
        }
    } else {
        // Éxito
        resultado.mensaje = `${accion.nombre} completada.`;

        // Aplicar recompensas
        let paguitas = accion.recompensaPaguitas;
        if (accion.id === 'top_manta' || accion.id === 'trabajo_negro') {
            paguitas = Math.floor(paguitas * personaje.bonus.trabajoB);
        }
        gameState.paguitas = Math.max(0, gameState.paguitas + paguitas);
        resultado.efectos.paguitas = paguitas;

        let papeles = Math.floor(accion.recompensaPapeles * personaje.bonus.papeles);
        gameState.papeles += papeles;
        resultado.efectos.papeles = papeles;

        // Efectos especiales
        if (accion.bonusPresupuesto) {
            gameState.presupuestoEspanol = Math.max(0, gameState.presupuestoEspanol + accion.bonusPresupuesto);
            resultado.efectos.presupuesto = accion.bonusPresupuesto;
        }

        if (accion.bonusPoblacion) {
            const poblacion = Math.floor(accion.bonusPoblacion * personaje.bonus.poblacion);
            gameState.poblacionInmigrante += poblacion;
            resultado.efectos.poblacion = poblacion;
        }

        if (accion.bonusNivelVida) {
            gameState.nivelVidaJugador = Math.min(100, gameState.nivelVidaJugador + accion.bonusNivelVida);
        }

        if (accion.multiplicadorAyudas) {
            gameState.multiplicadorTemporal = (gameState.multiplicadorTemporal || 1) * accion.multiplicadorAyudas;
            gameState.multiplicadorTemporalExpira = gameState.ticksTotales + (TICKS_POR_SEGUNDO * 60);
        }
    }

    // Alerta
    const alertaAccion = _calcularAlertaAccion(accion, personaje);
    gameState.alertaMediatica = Math.max(0, Math.min(ALERTA_MAX, gameState.alertaMediatica + alertaAccion));
    gameState.maxAlertaAlcanzada = Math.max(gameState.maxAlertaAlcanzada, gameState.alertaMediatica);

    // Cooldown
    if (accion.cooldown > 0) {
        gameState.cooldowns[accionId] = accion.cooldown;
    }

    // Registrar acción
    if (!gameState.accionesRealizadas.includes(accionId)) {
        gameState.accionesRealizadas.push(accionId);
    }

    // Stats
    gameState.stats.accionesEjecutadas++;

    return resultado;
}

function aplicarEfectosEvento(efectos) {
    if (!efectos || !gameState) return;

    if (efectos.paguitas) {
        gameState.paguitas = Math.max(0, gameState.paguitas + efectos.paguitas);
        if (efectos.paguitas > 0) {
            gameState.totalPaguitasGeneradas += efectos.paguitas;
        }
    }
    if (efectos.papeles) {
        gameState.papeles = Math.max(0, gameState.papeles + efectos.papeles);
    }
    if (efectos.alerta !== undefined) {
        gameState.alertaMediatica = Math.max(0, Math.min(ALERTA_MAX, gameState.alertaMediatica + efectos.alerta));
        gameState.maxAlertaAlcanzada = Math.max(gameState.maxAlertaAlcanzada, gameState.alertaMediatica);
    }
    if (efectos.presupuesto) {
        gameState.presupuestoEspanol = Math.max(0, gameState.presupuestoEspanol + efectos.presupuesto);
    }
    if (efectos.poblacion) {
        const personaje = getPersonajeActual();
        gameState.poblacionInmigrante += Math.floor(efectos.poblacion * personaje.bonus.poblacion);
    }
    if (efectos.inmunidadPolitica) {
        gameState.inmunidadPolitica = true;
    }

    // Stats
    gameState.stats.maxPaguitas = Math.max(gameState.stats.maxPaguitas, gameState.paguitas);
    gameState.stats.eventosVistos++;
}

function activarTrampaAuto(trampa) {
    if (!gameState || !trampa) return;

    // Mark as activated
    gameState.trampasActivadas[trampa.id] = true;

    // Apply immediate effects
    if (trampa.efectoInmediato) {
        aplicarEfectosEvento(trampa.efectoInmediato);
    }

    // Apply permanent debuff
    if (trampa.debuff) {
        if (!gameState.debuffs) gameState.debuffs = [];
        gameState.debuffs.push(trampa.debuff);
        calcularProduccion();
    }

    // Show the trap modal
    mostrarTrampa(trampa);

    saveGame();
}

function _calcularAlertaAccion(accion, personaje) {
    let alertaAccion = accion.subeAlerta || 0;
    if (personaje.especial === 'nativo_viogen' && alertaAccion > 0) {
        alertaAccion = Math.floor(alertaAccion * 0.5);
    }
    if (personaje.especial === 'nativo_enchufada' && alertaAccion > 0) {
        alertaAccion = Math.floor(alertaAccion * 0.8);
    }
    if (gameState.debuffs) {
        for (const debuff of gameState.debuffs) {
            if (debuff.alertaExtra) alertaAccion += debuff.alertaExtra;
        }
    }
    return alertaAccion;
}

function getProduccionInfo() {
    calcularProduccion();
    return {
        paguitas: gameState.vps,
        drenaje: gameState.dps,
        poblacion: gameState.pps
    };
}
