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

// === Định nghĩa tên cung và ID arrow tương ứng ===
const tags = ["fire_dragon", "ice_wyvern", "light_dragon"];
const arrowTypes = {
    fire_dragon: "faf:fire_arrow",
    ice_wyvern: "faf:ice_arrow",
    light_dragon: "faf:light_arrow"
};

// === Khi người chơi spawn ===
world.afterEvents.playerSpawn.subscribe(spawn => {
    // Không cần gameRule ở đây
});

// === Tên bắn trúng block ===
world.afterEvents.projectileHitBlock.subscribe(hit => {
    try {
        const p = hit.source;
        const projectile = hit.projectile;
        if (projectile && p) {
            for (const [tag, arrowId] of Object.entries(arrowTypes)) {
                if (p.hasTag(tag) && projectile.typeId === arrowId) {
                    if (p.hasTag("enchanted:infinity")) {
                        projectile.remove();
                    }
                }
            }
        }
    } catch (e) {
        console.warn(e);
    }
});

// === Tên bắn trúng entity ===
world.afterEvents.projectileHitEntity.subscribe(hit => {
    try {
        const p = hit.source;
        const projectile = hit.projectile;
        if (projectile && p) {
            for (const [tag, arrowId] of Object.entries(arrowTypes)) {
                if (p.hasTag(tag) && projectile.typeId === arrowId) {
                    if (p.hasTag("enchanted:infinity")) {
                        projectile.remove();
                    }
                }
            }
        }
    } catch (e) {
        console.warn(e);
    }
});

// === Dừng sử dụng cung (bỏ kéo) ===
world.afterEvents.itemStopUse.subscribe(stop => {
    try {
        const p = stop.source;
        const item = stop.itemStack;

        for (const tag of tags) {
            if (p.hasTag(tag)) {
                if (item.typeId === `faf:${tag}_bow` && p.hasTag("using")) {
                    Durability(item, p);
                }
            }
        }

        p.removeTag("using");
    } catch (e) {
        console.warn(e);
    }
});

// === Phát animation nếu đang dùng cung có arrow đúng ===
function bowUsing(p) {
    if (!p.hasTag("using")) return;

    const equip = p.getComponent(EntityEquippableComponent.componentId);
    const hand = equip.getEquipment(EquipmentSlot.Mainhand);

    for (const tag of tags) {
        if (hand?.typeId === `faf:${tag}_bow`) {
            const arrowId = arrowTypes[tag];
            p.runCommandAsync(`playanimation @s[hasitem={item=${arrowId}}] animation.weapons.bow_and_arrow root 0.001 "!query.is_using_item"`);
        }
    }
}

// === Kiểm tra enchant và gán tag tương ứng ===
function detectEnchantements(p) {
    const equip = p.getComponent(EntityEquippableComponent.componentId);
    const hand = equip.getEquipment(EquipmentSlot.Mainhand);

    if (hand) {
        const enchantable = hand.getComponent("enchantable");

        for (const tag of tags) {
            if (hand.typeId === `faf:${tag}_bow` && enchantable) {
                if (enchantable.getEnchantment("infinity")) {
                    p.addTag("enchanted:infinity");
                } else {
                    p.removeTag("enchanted:infinity");
                }

                if (enchantable.getEnchantments().length === 0) {
                    removeAllEnchantedTags(p);
                }
                return;
            }
        }

        if (!hand.typeId.includes("_bow")) {
            removeAllEnchantedTags(p);
        }
    } else {
        removeAllEnchantedTags(p);
    }
}

// === Xóa toàn bộ tag bắt đầu với "enchanted:" ===
function removeAllEnchantedTags(p) {
    for (const tag of p.getTags()) {
        if (tag.startsWith("enchanted:")) {
            p.removeTag(tag);
        }
    }
}