import * as mc from "@minecraft/server"
import { ItemSkills, itemStack } from "./item"
import { entitiesTypes } from "../../index";

/**
 * Chamado quando uma entidade é atacada com um item.
 * @param {mc.Player} player - O player a segurar o item.
 */
export function onDamageItem(player, entity) {
}

/**
 * Chamado quando uma entidade é atacada com um item.
 * @param {mc.Player} player - O player a segurar o item.
 */
export function onKillItem(player, entity) {
    levelSystem(player, entity)
}
/**
 * Função chamada quando o player mata uma entidade usando um item.
 * @description Executa um sistema de nivelamento básico.
 * @param { mc.Player } player - O jogador segurando o item.
 */
async function levelSystem(player, entity) {
    /** @type { mc.ItemStack } */
    const item = itemStack

    let level = player.getDynamicProperty(item.typeId + ".lvl") ?? 1
    let xp = player.getDynamicProperty(item.typeId + ".xp") ?? 0
    let xpm = player.getDynamicProperty(item.typeId + ".xpm") ?? 10
    let ult = player.getDynamicProperty(item.typeId + ".ult") ?? 0

    const entityType = entitiesTypes.find(e => e.entities.has(entity.typeId))
    if (!entityType) return
    if (level < 5) {
        mc.world.getDynamicProperty("ld_eb.:boost_time") > 0 ? Math.round(xp += entityType.xp * 2) : Math.round(xp += entityType.xp)

        while (xp >= xpm) {
            level += 1
            xp -= xpm
            xpm += xpm / 3

            player.setDynamicProperty(item.typeId + ".lvl", level)
            player.setDynamicProperty(item.typeId + ".xpm", Math.round(xpm))
        }
        player.setDynamicProperty(item.typeId + ".xp", Math.round(xp))
    } else {
        ult += 1
        
        if (ult <= 10) {
            player.setDynamicProperty(item.typeId + ".ult", ult)
        }
        if(level < 10) {
        mc.world.getDynamicProperty("ld_eb.:boost_time") > 0 ? Math.round(xp += entityType.xp * 2) : Math.round(xp += entityType.xp)
        while (xp >= xpm) {
            level += 1
            xp -= xpm
            xpm *= 2

            player.setDynamicProperty(item.typeId + ".lvl", level)
            player.setDynamicProperty(item.typeId + ".xpm", xpm)
        }
        player.setDynamicProperty(item.typeId + ".xp", Math.round(xp))
        }
    }

    await mc.system.waitTicks(1)

    const itemSkills = new ItemSkills(item, player)
    itemSkills.interface()
}