import { world } from "@minecraft/server";

export async function insomnioCheck(player) {
    const dimension = player.dimension.id;
    const yPosition = player.location.y;

    try {
        // Comprobar si el jugador está en modo aventura o supervivencia
        const result = await player.runCommandAsync("testfor @s[m=adventure]").catch(() => null);

        if (!result) {
            const resultSurvival = await player.runCommandAsync("testfor @s[m=survival]").catch(() => null);
            if (!resultSurvival) {
                await reduceInsomnio(player); // Restar puntos si no está en modos permitidos
                return;
            }
        }

        // Condición 1: En el Nether (siempre aumenta insomnio)
        if (dimension === "minecraft:nether") {
            await applyInsomnio(player);
        }
        // Condición 2: En oscuridad baja y bajo tierra
        else if (yPosition < 0 && getBrightness(player) < 0.2) {
            await applyInsomnio(player);
        }
        // Condición 4: En oscuridad baja pero no bajo tierra (por encima del nivel 0)
        else if (yPosition >= 0 && getBrightness(player) < 0.25) {
            await applyInsomnio(player);
        } else {
            await reduceInsomnio(player); // Restar puntos si no se cumplen las condiciones
        }
    } catch (error) {
        console.error(`Error verificando el modo de juego del jugador ${player.name}:`, error);
    }
}

// Función para aplicar el comando de insomnio
async function applyInsomnio(player) {
    try {
        // Verificar si el objetivo "insomnio" existe y su puntaje
        if (!player.hasTag("viewing_info")) {
        const result = await world.getDimension("overworld").runCommandAsync(
            `execute if entity @a[tag=!fear_info,r=1.25] if entity @a[tag=!viewing_info,r=1.25] run titleraw  @a[tag=!fear_info,r=1.25,m=0,scores={insomnio=3000..}] actionbar {\"rawtext\":[{\"translate\":\"dungeon.langcode.insomnio1\"}]}`
            `scoreboard players test ${player.name} insomnio 0 120000`
        ).catch(() => null);}

        if (!result) {
            console.warn(`No se pudo verificar el scoreboard para el jugador ${player.name}.`);
            return;
        }

        // Añadir 5 puntos al scoreboard "insomnio"
        await world.getDimension("overworld").runCommandAsync(
            `scoreboard players add ${player.name} insomnio 5`
        );

        // Marcar el insomnio activado para evitar múltiples ejecuciones
        player.addTag("insomnio_activated");
    } catch (error) {
        console.error(`Error en applyInsomnio para el jugador ${player.name}:`, error);
    }
}

// Función para restar puntos del scoreboard "insomnio"
async function reduceInsomnio(player) {
    try {
        // Verificar si el puntaje ya es 0 o menor
        const result = await world.getDimension("overworld").runCommandAsync(
            `scoreboard players test ${player.name} insomnio 0 10`
        ).catch(() => null);

        if (!result) {
            // Si el puntaje es menor a 10, establecerlo en 0 para evitar negativos
            await world.getDimension("overworld").runCommandAsync(
                `scoreboard players set ${player.name} insomnio 0`
            );
            return;
        }

        // Restar 10 puntos del scoreboard "insomnio"
        if (!player.hasTag("viewing_info")) {
        await world.getDimension("overworld").runCommandAsync(
            `execute if entity @a[tag=!fear_info,r=1.25] if entity @a[tag=!viewing_info,r=1.25] run titleraw  @a[tag=!fear_info,r=1.25,m=0,scores={insomnio=3000..}] actionbar {\"rawtext\":[{\"translate\":\"dungeon.langcode.fear\"}]}`
            `scoreboard players remove ${player.name} insomnio 10`
        );
    }} catch (error) {
        console.error(`Error en reduceInsomnio para el jugador ${player.name}:`, error);
    }
}

// Simulación de una función para obtener la iluminación del entorno del jugador
function getBrightness(player) {
    // Aquí puedes implementar una simulación o utilizar un sistema externo
    // Para este ejemplo, la función retorna un valor simulado. Debes ajustarlo según tus necesidades.
    const simulatedBrightness = 0.5; // Cambiar según los valores reales de tu sistema
    return simulatedBrightness;
}
