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

/* =====================================================
   CONFIGURAÇÃO
===================================================== */

// Famílias que podem ter LEVEL + HP
const LEVEL_FAMILIES = [
    "monster",
    "hostile"
];
// Famílias que NÃO devem ter LEVEL + HP
//const EXCLUDED_FAMILIES = [
//    "fish",
//    "aquatic",
//    "water",
//    "ambient"
//];
//
const EXCLUDED_FAMILIES = [
    "dragon", "sistema", "wandering_trader", "dragao", "player", "npc", "boss",
    "animal", "parrot_wild", "egg", "estatua", "bau", "vex", "teleporte",
    "camera", "armor_stand", "sumir", "encantamento_sereia", "blocos_congelados",
    "blocos_envenenados", "mochila", "npc_crianca", "inanimate", "ambient", "fish",
    "aquatic", "water"
];

// Mobs específicos (opcional)
const LEVEL_MOB_TYPES = [
    "minecraft:zombie",
    "minecraft:skeleton",
    "minecraft:creeper",
    "well:esqueleto_guerreiro_congelado"
];

/* =====================================================
   FUNÇÕES AUXILIARES
===================================================== */

// Formata HP com cor
function formatHP(hp) {
    hp = Math.floor(hp);
    if (hp >= 20) return `§a${hp}`;
    if (hp >= 10) return `§e${hp}`;
    if (hp >= 5) return `§c${hp}`;
    return `§4${hp}`;
}

// Pega o maior LvX das tags
function getMobLevel(entity) {
    let highestLv = null;

    for (const tag of entity.getTags()) {
        const match = tag.match(/^lv(\d+)$/i);
        if (match) {
            const lv = parseInt(match[1]);
            if (!highestLv || lv > highestLv) {
                highestLv = lv;
            }
        }
    }

    return highestLv;
}

// Verifica se o mob pode receber sistema (NÃO PET)
function canHaveSystem(entity) {
    // Ignora jogadores
    if (entity.typeId === "minecraft:player") return false;

    // 🚫 IGNORA PETS (ESSENCIAL)
    if (entity.hasTag("pet")) return false;

    // Ignora entidades sem vida
    const health = entity.getComponent("minecraft:health");
    if (!health) return false;

    // Ignora mobs domados vanilla
    const tameable = entity.getComponent("minecraft:tameable");
    if (tameable && tameable.isTamed) return false;

    const family = entity.getComponent("minecraft:type_family");
    if (!family) return true;

    // Bloqueia famílias excluídas
    for (const excluded of EXCLUDED_FAMILIES) {
        if (family.hasTypeFamily(excluded)) return false;
    }

    return true;
}



/* =====================================================
   ATUALIZA NAMETAG (LEVEL + HP)
===================================================== */

function updateMobNametag(entity) {
    if (!canHaveSystem(entity)) return;

    const healthComp = entity.getComponent("minecraft:health");
    if (!healthComp) return;

    const hpText = formatHP(healthComp.currentValue);
    const level = getMobLevel(entity);

    // 🟥 Mob COM nível → LV + HP
    if (level) {
        entity.nameTag = `§4§lLv ${level}§r ${hpText}`;
        return;
    }

    // 🟩 Mob SEM nível → só HP
    entity.nameTag = `${hpText}`;
}


// Remove nameTag quando longe (permite despawn)
function clearMobNametag(entity) {
    if (!entity.nameTag) return;

    if (entity.nameTag.includes("")) {
        entity.nameTag = "";
    }
}

/* =====================================================
   EVENTO DE DANO (ATUALIZA INSTANTÂNEO)
===================================================== */

world.afterEvents.entityHurt.subscribe(ev => {
    const entity = ev.hurtEntity;
    if (!entity) return;

    if (!canHaveSystem(entity)) return;

    system.runTimeout(() => updateMobNametag(entity), 1);
});

/* =====================================================
   LOOP PRINCIPAL (OTIMIZADO)
===================================================== */

system.runInterval(() => {
    const players = world.getAllPlayers();
    if (!players.length) return;

    for (const player of players) {
        const dimension = player.dimension;
        const location = player.location;

        // PRÓXIMOS → MOSTRA LV + HP
        dimension.getEntities({
            location,
            maxDistance: 40
        }).forEach(updateMobNametag);

        // LONGE → LIMPA TAG (DESPAWN NORMAL)
        dimension.getEntities({
            location,
            minDistance: 80,
            maxDistance: 160
        }).forEach(clearMobNametag);
    }
}, 80); // ~4 segundos
