/**@param {Player} player  */
function saveInventoryToBackpack(player, mochilaEntity) {
    if (!mochilaEntity || mochilaEntity.typeId !== "well:mochila") {
        console.log("A entidade fornecida não é uma mochila válida.");
        return;
    }

    const backpackContainer = mochilaEntity.getComponent("inventory");
    if (!backpackContainer) {
        console.log("A mochila não possui um componente de inventário.");
        return;
    }

    const items = [];
    const backpackSize = backpackContainer.inventorySize;

    // Itera sobre os slots do inventário do jogador
    const { container, inventorySize } = player.getComponent("inventory");
    for (let i = 0; i < inventorySize; i++) {
        const item = container.getItem(i);
        if (!item) {
            items.push(null);
            continue;
        }
        const data = {
            typeId: item.typeId,
            props: {
                amount: item.amount,
                keepOnDeath: item.keepOnDeath,
                lockMode: item.lockMode
            },
            lore: item.getLore(),
            components: {}
        };
        if (item.nameTag) data.props.nameTag = item.nameTag;
        if (item.hasComponent("enchantable")) {
            data.components.enchantable = item.getComponent("enchantable").getEnchantments().map(e => ({ type: e.type.id, level: e.level }));
        }
        if (item.hasComponent("durability")) {
            data.components.durability = item.getComponent("durability").damage;
        }
        items.push(data);
    }

    // Salva os itens do inventário na mochila
    player.setDynamicProperty(`backpack:well:mochila:${mochilaEntity.id}`, JSON.stringify(items));
    console.log("Inventário salvo na mochila com sucesso.");
}

/**@param {Player} player  */
function loadInventoryFromBackpack(player, mochilaEntity) {
    if (!mochilaEntity || mochilaEntity.typeId !== "well:mochila") {
        console.log("A entidade fornecida não é uma mochila válida.");
        return;
    }

    const backpackContainer = mochilaEntity.getComponent("inventory");
    if (!backpackContainer) {
        console.log("A mochila não possui um componente de inventário.");
        return;
    }

    const items = JSON.parse(player.getDynamicProperty(`backpack:well:mochila:${mochilaEntity.id}`) ?? "[]");
    const backpackSize = backpackContainer.inventorySize;

    // Preenche o inventário do jogador com os itens salvos
    const { container, inventorySize } = player.getComponent("inventory");
    for (let i = 0; i < inventorySize; i++) {
        const data = items[i];
        if (!data) {
            container.setItem(i, null);
        } else {
            const item = new ItemStack(data.typeId);
            for (const key in data.props) {
                item[key] = data.props[key];
            }
            item.setLore(data.lore);
            if (data.components.enchantable) {
                item.getComponent("enchantable").addEnchantments(data.components.enchantable.map(e => ({...e, type: new EnchantmentType(e.type)})));
            }
            if (data.components.durability) {
                item.getComponent("durability").damage = data.components.durability;
            }
            container.setItem(i, item);
        }
    }
    console.log("Inventário carregado da mochila com sucesso.");
}

/**@param {Player} player  */
function interactWithBackpack(player, mochilaEntity) {
    if (!mochilaEntity || mochilaEntity.typeId !== "well:mochila") {
        console.log("A entidade fornecida não é uma mochila válida.");
        return;
    }

    // Salva o inventário do jogador na mochila
    saveInventoryToBackpack(player, mochilaEntity);

    // Carrega os itens salvos na mochila de volta para o inventário do jogador
    loadInventoryFromBackpack(player, mochilaEntity);

    console.log("Mochila interagida com sucesso. Inventário salvo e carregado.");
}

// Exporta as funções para uso em outros arquivos
export { saveInventoryToBackpack, loadInventoryFromBackpack, interactWithBackpack };
