package net.minecraft.world.inventory;

import net.minecraft.core.NonNullList;
import net.minecraft.nbt.ListTag;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;

import com.bergerkiller.generated.net.minecraft.world.inventory.SlotHandle;
import com.bergerkiller.generated.net.minecraft.world.inventory.AbstractContainerMenuHandle;
import com.bergerkiller.generated.net.minecraft.world.inventory.AnvilMenuHandle;

import com.bergerkiller.bukkit.common.nbt.CommonTagList;

class PlayerEnderChestContainer extends Container {
#if version >= 1.20.5
    public void loadFromNBT((CommonTagList) ListTag nbttaglist) {
        #require PlayerEnderChestContainer private final net.minecraft.world.entity.player.Player owner;
        net.minecraft.world.entity.player.Player owner = instance#owner;
        net.minecraft.core.HolderLookup$Provider holderLookup = owner.registryAccess();

  #if version >= 1.21.6
        com.bergerkiller.bukkit.common.internal.logic.ScopedProblemReporter reporter = #createScopedProblemReporter();
        try {
            net.minecraft.world.level.storage.ValueInput$TypedInputList valueList = #createTagListValueInput(reporter, holderLookup, net.minecraft.world.ItemStackWithSlot.CODEC, nbttaglist);
            instance.fromSlots(valueList);
        } finally {
            reporter.close();
        }
  #else
        instance.fromTag(nbttaglist, holderLookup);
  #endif
    }

#elseif version >= 1.18
    public void loadFromNBT:fromTag((CommonTagList) ListTag nbttaglist)
#else
    public void loadFromNBT:a((CommonTagList) ListTag nbttaglist)
#endif

#if version >= 1.20.5
    public (CommonTagList) ListTag saveToNBT() {
        #require PlayerEnderChestContainer private final net.minecraft.world.entity.player.Player owner;
        net.minecraft.world.entity.player.Player owner = instance#owner;
        net.minecraft.core.HolderLookup$Provider holderLookup = owner.registryAccess();

  #if version >= 1.21.6
        com.bergerkiller.bukkit.common.internal.logic.ScopedProblemReporter reporter = #createScopedProblemReporter();
        try {
            ListTag nbttaglist = new ListTag();
            net.minecraft.world.level.storage.ValueOutput$TypedOutputList valueList = #createTagListValueOutput(reporter, holderLookup, net.minecraft.world.ItemStackWithSlot.CODEC, nbttaglist);
            instance.storeAsSlots(valueList);
            return nbttaglist;
        } finally {
            reporter.close();
        }
  #else
        return instance.createTag(owner.registryAccess());
  #endif
    }

#elseif version >= 1.18
    public (CommonTagList) ListTag saveToNBT:createTag()
#elseif version >= 1.16
    public (CommonTagList) ListTag saveToNBT:g()
#elseif version >= 1.14
    public (CommonTagList) ListTag saveToNBT:f()
#elseif version >= 1.11
    public (CommonTagList) ListTag saveToNBT:i()
#else
    public (CommonTagList) ListTag saveToNBT:h()
#endif
}

class MerchantContainer extends Container {
    private final (Object) net.minecraft.world.item.trading.Merchant merchant;
}

class AbstractContainerMenu {
#if version >= 1.17
    public (List<org.bukkit.inventory.ItemStack>) NonNullList<ItemStack> oldItems:lastSlots;
#elseif version >= 1.12.2
    public (List<org.bukkit.inventory.ItemStack>) NonNullList<ItemStack> oldItems:items;
#elseif version >= 1.11
    public (List<org.bukkit.inventory.ItemStack>) NonNullList<ItemStack> oldItems:b;
#else
    public (List<org.bukkit.inventory.ItemStack>) List<ItemStack> oldItems:b;
#endif

#if version >= 1.17
    public (List<SlotHandle>) NonNullList<Slot> slots;
#elseif version >= 1.12.2
    public (List<SlotHandle>) List<Slot> slots:slots;
#else
    public (List<SlotHandle>) List<Slot> slots:c;
#endif

#if version >= 1.17
    public int windowId:containerId;
#else
    public int windowId;
#endif

    public abstract org.bukkit.inventory.InventoryView getBukkitView();

    public static AbstractContainerMenuHandle fromBukkit(org.bukkit.inventory.InventoryView bukkitView) {
        if (bukkitView instanceof org.bukkit.craftbukkit.inventory.CraftInventoryView) {
            net.minecraft.world.inventory.AbstractContainerMenu handle;
            handle = ((org.bukkit.craftbukkit.inventory.CraftInventoryView) bukkitView).getHandle();
            return com.bergerkiller.generated.net.minecraft.world.inventory.AbstractContainerMenuHandle.createHandle(handle);
        } else {
            return null;
        }
    }
}

class AnvilMenu extends AbstractContainerMenu {
#if version >= 1.17
    public String renameText:itemName;
#elseif version >= 1.12
    public String renameText;
#elseif version >= 1.11
    public String renameText:l;
#else
    private String renameText:l;
#endif

    public static AnvilMenuHandle fromBukkit(org.bukkit.inventory.InventoryView bukkitView) {
        if (bukkitView instanceof org.bukkit.craftbukkit.inventory.CraftInventoryView) {
            net.minecraft.world.inventory.AbstractContainerMenu handle;
            handle = ((org.bukkit.craftbukkit.inventory.CraftInventoryView) bukkitView).getHandle();
            return com.bergerkiller.generated.net.minecraft.world.inventory.AnvilMenuHandle.createHandle(handle);
        } else {
            return null;
        }
    }
}

class Slot {
    public (org.bukkit.inventory.ItemStack) ItemStack getItem();
}
