ItemGUIContent.java

package it.fulminazzo.yagl.contents;

import it.fulminazzo.yagl.Metadatable;
import it.fulminazzo.yagl.actions.GUIItemAction;
import it.fulminazzo.yagl.contents.requirements.RequirementChecker;
import it.fulminazzo.yagl.items.Item;
import it.fulminazzo.yagl.items.fields.ItemField;
import it.fulminazzo.yagl.items.fields.ItemFlag;
import it.fulminazzo.yagl.wrappers.Enchantment;
import it.fulminazzo.yagl.wrappers.Sound;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * A {@link GUIContent} that contains a single {@link Item}.
 * It also extends the interface to easily modify it without accessing it directly.
 */
public class ItemGUIContent extends GUIContentImpl implements GUIContent, Item {
    private final Item item;

    private ItemGUIContent() {
        this(Item.newItem());
    }

    private ItemGUIContent(final @NotNull String material) {
        this(Item.newItem(material));
    }

    private ItemGUIContent(final @NotNull Item item) {
        this.item = item.copy(Item.class);
    }

    @Override
    public @NotNull Item internalRender() {
        return this.item.copy();
    }

    @Override
    public ItemGUIContent setMaterial(@NotNull String material) {
        this.item.setMaterial(material);
        return this;
    }

    @Override
    public @Nullable String getMaterial() {
        return this.item.getMaterial();
    }

    @Override
    public ItemGUIContent setAmount(int amount) {
        this.item.setAmount(amount);
        return this;
    }

    @Override
    public int getAmount() {
        return this.item.getAmount();
    }

    @Override
    public ItemGUIContent setDurability(int durability) {
        this.item.setDurability(durability);
        return this;
    }

    @Override
    public int getDurability() {
        return this.item.getDurability();
    }

    @Override
    public ItemGUIContent setDisplayName(@NotNull String displayName) {
        this.item.setDisplayName(displayName);
        return this;
    }

    @Override
    public @NotNull String getDisplayName() {
        return this.item.getDisplayName();
    }

    @Override
    public @NotNull List<String> getLore() {
        return this.item.getLore();
    }

    @Override
    public Set<Enchantment> getEnchantments() {
        return this.item.getEnchantments();
    }

    @Override
    public Set<ItemFlag> getItemFlags() {
        return this.item.getItemFlags();
    }

    @Override
    public ItemGUIContent setUnbreakable(boolean unbreakable) {
        this.item.setUnbreakable(unbreakable);
        return this;
    }

    @Override
    public boolean isUnbreakable() {
        return this.item.isUnbreakable();
    }

    @Override
    public ItemGUIContent setCustomModelData(int customModelData) {
        this.item.setCustomModelData(customModelData);
        return this;
    }

    @Override
    public int getCustomModelData() {
        return this.item.getCustomModelData();
    }

    @Override
    public boolean isSimilar(@Nullable Item item, ItemField @NotNull ... ignore) {
        return this.item.isSimilar(item, ignore);
    }

    @Override
    public ItemGUIContent addLore(String @NotNull ... lore) {
        return (ItemGUIContent) Item.super.addLore(lore);
    }

    @Override
    public ItemGUIContent addLore(@NotNull Collection<String> lore) {
        return (ItemGUIContent) Item.super.addLore(lore);
    }

    @Override
    public ItemGUIContent removeLore(String @NotNull ... lore) {
        return (ItemGUIContent) Item.super.removeLore(lore);
    }

    @Override
    public ItemGUIContent removeLore(@NotNull Collection<String> lore) {
        return (ItemGUIContent) Item.super.removeLore(lore);
    }

    @Override
    public ItemGUIContent setLore(String @NotNull ... lore) {
        return (ItemGUIContent) Item.super.setLore(lore);
    }

    @Override
    public ItemGUIContent setLore(@NotNull Collection<String> lore) {
        return (ItemGUIContent) Item.super.setLore(lore);
    }

    @Override
    public ItemGUIContent addEnchantment(@NotNull String enchantment, int level) {
        return (ItemGUIContent) Item.super.addEnchantment(enchantment, level);
    }

    @Override
    public ItemGUIContent addEnchantments(String @NotNull ... enchantments) {
        return (ItemGUIContent) Item.super.addEnchantments(enchantments);
    }

    @Override
    public ItemGUIContent addEnchantments(Enchantment @NotNull ... enchantments) {
        return (ItemGUIContent) Item.super.addEnchantments(enchantments);
    }

    @Override
    public ItemGUIContent addEnchantments(@NotNull Collection<Enchantment> enchantments) {
        return (ItemGUIContent) Item.super.addEnchantments(enchantments);
    }

    @Override
    public ItemGUIContent removeEnchantment(@NotNull String enchantment, int level) {
        return (ItemGUIContent) Item.super.removeEnchantment(enchantment, level);
    }

    @Override
    public ItemGUIContent removeEnchantments(String @NotNull ... enchantments) {
        return (ItemGUIContent) Item.super.removeEnchantments(enchantments);
    }

    @Override
    public ItemGUIContent removeEnchantments(Enchantment @NotNull ... enchantments) {
        return (ItemGUIContent) Item.super.removeEnchantments(enchantments);
    }

    @Override
    public ItemGUIContent removeEnchantments(@NotNull Collection<Enchantment> enchantments) {
        return (ItemGUIContent) Item.super.removeEnchantments(enchantments);
    }

    @Override
    public ItemGUIContent addItemFlags(ItemFlag @NotNull ... itemFlags) {
        return (ItemGUIContent) Item.super.addItemFlags(itemFlags);
    }

    @Override
    public ItemGUIContent addItemFlags(@NotNull Collection<ItemFlag> itemFlags) {
        return (ItemGUIContent) Item.super.addItemFlags(itemFlags);
    }

    @Override
    public ItemGUIContent removeItemFlags(ItemFlag @NotNull ... itemFlags) {
        return (ItemGUIContent) Item.super.removeItemFlags(itemFlags);
    }

    @Override
    public ItemGUIContent removeItemFlags(@NotNull Collection<ItemFlag> itemFlags) {
        return (ItemGUIContent) Item.super.removeItemFlags(itemFlags);
    }

    public @NotNull ItemGUIContent copy() {
        return ItemGUIContent.newInstance(this.item.copy()).copyFrom(this, true);
    }

    @Override
    public @NotNull ItemGUIContent setClickSound(Sound sound) {
        return (ItemGUIContent) super.setClickSound(sound);
    }

    @Override
    public @NotNull ItemGUIContent setPriority(int priority) {
        return (ItemGUIContent) super.setPriority(priority);
    }

    @Override
    public @NotNull ItemGUIContent setViewRequirements(@NotNull RequirementChecker requirements) {
        return (ItemGUIContent) super.setViewRequirements(requirements);
    }

    @Override
    public @NotNull ItemGUIContent onClickItemClose() {
        return (ItemGUIContent) super.onClickItemClose();
    }

    @Override
    public @NotNull ItemGUIContent onClickItem(@NotNull GUIItemAction action) {
        return (ItemGUIContent) super.onClickItem(action);
    }

    @Override
    public @NotNull ItemGUIContent setViewRequirements(@NotNull String permission) {
        return (ItemGUIContent) super.setViewRequirements(permission);
    }

    @Override
    public @NotNull ItemGUIContent onClickItem(@NotNull String command) {
        return (ItemGUIContent) super.onClickItem(command);
    }

    @Override
    public @NotNull ItemGUIContent copyFrom(@NotNull Metadatable other, boolean replace) {
        return (ItemGUIContent) super.copyFrom(other, replace);
    }

    @Override
    public @NotNull ItemGUIContent copyAll(@NotNull Metadatable other, boolean replace) {
        return (ItemGUIContent) super.copyAll(other, replace);
    }

    @Override
    public @NotNull ItemGUIContent unsetVariable(@NotNull String name) {
        return (ItemGUIContent) super.unsetVariable(name);
    }

    @Override
    public @NotNull ItemGUIContent setVariable(@NotNull String name, @NotNull String value) {
        return (ItemGUIContent) super.setVariable(name, value);
    }

    /**
     * Creates an instance of {@link ItemGUIContent}.
     *
     * @return the item gui content
     */
    public static ItemGUIContent newInstance() {
        return new ItemGUIContent();
    }

    /**
     * Creates an instance of {@link ItemGUIContent} with the given material.
     *
     * @param material the material
     * @return the item gui content
     */
    public static ItemGUIContent newInstance(final @NotNull String material) {
        return new ItemGUIContent(material);
    }

    /**
     * Creates an instance of {@link ItemGUIContent} with the given item.
     *
     * @param item the item
     * @return the item gui content
     */
    public static ItemGUIContent newInstance(final @NotNull Item item) {
        return new ItemGUIContent(item);
    }

}