import { world, system, ItemStack } from "@minecraft/server";
import { ConfigSamehada } from "./config.js";

if (!world.scoreboard.getObjective(ConfigSamehada.Sistema.ObjetivoScore)) {
    world.scoreboard.addObjective(ConfigSamehada.Sistema.ObjetivoScore, "Chakra Samehada");
}

world.afterEvents.entityHitEntity.subscribe((evento) => {
    const atacante = evento.damagingEntity;
    const vitima = evento.hitEntity;

    if (!atacante || atacante.typeId !== "minecraft:player") return;

    const inventario = atacante.getComponent("minecraft:inventory");
    const container = inventario.container;
    const itemMao = container.getItem(atacante.selectedSlotIndex);

    if (!itemMao) return;

    if (itemMao.typeId === ConfigSamehada.Itens.Selada) {
        gerenciarSamehadaSelada(atacante, vitima, container, atacante.selectedSlotIndex);
    } else if (itemMao.typeId === ConfigSamehada.Itens.Liberada) {
        gerenciarSamehadaLiberada(atacante, vitima);
    }
});

function gerenciarSamehadaSelada(player, vitima, container, slot) {
    const dados = ConfigSamehada.Valores.Selada;
    const objetivo = ConfigSamehada.Sistema.ObjetivoScore;
    const meta = ConfigSamehada.Sistema.MetaParaEvoluir;

    const ehPlayer = vitima.typeId === "minecraft:player";
    const roubo = ehPlayer ? dados.Player.Rouba : dados.Mob.Rouba;
    const ganho = ehPlayer ? dados.Player.Ganha : dados.Mob.Ganha;

    aplicarTrocaChakra(player, vitima, roubo, ganho);
    adicionarScore(player, objetivo, roubo);

    const acumulado = lerScore(player, objetivo);

    if (acumulado >= meta) {
        definirScore(player, objetivo, 0);

        system.run(() => {
            container.setItem(slot, new ItemStack(ConfigSamehada.Itens.Liberada));
            player.addTag("modo_samehada"); // ✅ adiciona a tag ao liberar
            player.sendMessage(`§b--------------------------------`);
            player.sendMessage(`§bA Samehada absorveu chakra suficiente!`);
            player.sendMessage(`§d§lSAMEHADA LIBERADA!`);
            player.sendMessage(`§eVocê tem §l2 MINUTOS§r§e até ela voltar ao normal!`);
            player.sendMessage(`§b--------------------------------`);
            player.playSound("random.levelup");
        });

        // Depois de 2 minutos (2400 ticks), volta ao normal
        system.runTimeout(() => {
            const itemAtual = container.getItem(slot);
            if (itemAtual && itemAtual.typeId === ConfigSamehada.Itens.Liberada) {
                container.setItem(slot, new ItemStack(ConfigSamehada.Itens.Selada));
                player.sendMessage(`§cO tempo acabou! A Samehada voltou ao normal.`);
                player.playSound("random.orb");
                // ❌ não remove a tag modo_samehada
            }
        }, 2400);
    }
}

function gerenciarSamehadaLiberada(player, vitima) {
    const dados = ConfigSamehada.Valores.Liberada;

    const ehPlayer = vitima.typeId === "minecraft:player";
    const roubo = ehPlayer ? dados.Player.Rouba : dados.Mob.Rouba;
    const ganho = ehPlayer ? dados.Player.Ganha : dados.Mob.Ganha;

    aplicarTrocaChakra(player, vitima, roubo, ganho);
}

function aplicarTrocaChakra(atacante, vitima, roubo, ganho) {
    if (vitima.typeId === "minecraft:player") {
        const chakraVitima = getProp(vitima, "chakraCarga");
        if (chakraVitima > 0) {
            setProp(vitima, "chakraCarga", Math.max(0, chakraVitima - roubo));
        }
    }

    const chakraAtacante = getProp(atacante, "chakraCarga");
    const chakraMax = getProp(atacante, "chakraMax") || 100;

    if (chakraAtacante < chakraMax) {
        setProp(atacante, "chakraCarga", Math.min(chakraMax, chakraAtacante + ganho));
    }
}

function lerScore(player, idObjetivo) {
    const objetivo = world.scoreboard.getObjective(idObjetivo);
    if (!objetivo) return 0;
    if (!objetivo.hasParticipant(player)) return 0;
    return objetivo.getScore(player) ?? 0;
}

function adicionarScore(player, idObjetivo, valor) {
    const objetivo = world.scoreboard.getObjective(idObjetivo);
    if (objetivo) {
        objetivo.addScore(player, valor);
    }
}

function definirScore(player, idObjetivo, valor) {
    const objetivo = world.scoreboard.getObjective(idObjetivo);
    if (objetivo) {
        objetivo.setScore(player, valor);
    }
}

function getProp(player, chave) {
    return parseInt(player.getDynamicProperty(chave)) || 0;
}

function setProp(player, chave, valor) {
    player.setDynamicProperty(chave, valor);
}