package mekanism.common.inventory;
import mekanism.api.util.StackUtils;
import mekanism.common.Tier.BinTier;
import mekanism.common.base.ITierItem;
import mekanism.common.block.states.BlockStateBasic.BasicBlockType;
import mekanism.common.util.ItemDataUtils;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
public class InventoryBin
{
public ItemStack bin;
public InventoryBin(ItemStack stack)
{
bin = stack;
}
public ItemStack getStack()
{
if(getItemCount() > 0 && getItemType() != null)
{
ItemStack ret = getItemType().copy();
ret.stackSize = Math.min(getItemType().getMaxStackSize(), getItemCount());
return ret;
}
return null;
}
public ItemStack removeStack()
{
ItemStack stack = getStack();
if(stack == null)
{
return null;
}
if(getTier() != BinTier.CREATIVE)
{
setItemCount(getItemCount() - stack.stackSize);
}
return stack.copy();
}
public ItemStack add(ItemStack stack)
{
if(isValid(stack) && (getTier() == BinTier.CREATIVE || getItemCount() != getMaxStorage()))
{
if(getItemType() == null)
{
setItemType(stack);
}
if(getTier() != BinTier.CREATIVE)
{
if(getItemCount() + stack.stackSize <= getMaxStorage())
{
setItemCount(getItemCount() + stack.stackSize);
return null;
}
else {
ItemStack rejects = getItemType().copy();
rejects.stackSize = (getItemCount()+stack.stackSize) - getMaxStorage();
setItemCount(getMaxStorage());
return rejects;
}
}
else {
setItemCount(Integer.MAX_VALUE);
}
}
return stack;
}
public boolean isValid(ItemStack stack)
{
if(stack == null || stack.stackSize <= 0)
{
return false;
}
if(BasicBlockType.get(stack) == BasicBlockType.BIN)
{
return false;
}
if(getItemType() == null)
{
return true;
}
if(!stack.isItemEqual(getItemType()) || !ItemStack.areItemStackTagsEqual(stack, getItemType()))
{
return false;
}
return true;
}
public int getMaxStorage()
{
return getTier().storage;
}
public BinTier getTier()
{
return BinTier.values()[((ITierItem)bin.getItem()).getBaseTier(bin).ordinal()];
}
public int getItemCount()
{
return ItemDataUtils.getInt(bin, "itemCount");
}
public void setItemCount(int count)
{
ItemDataUtils.setInt(bin, "itemCount", Math.max(0, count));
if(getItemCount() == 0)
{
setItemType(null);
}
}
public ItemStack getItemType()
{
if(getItemCount() == 0)
{
return null;
}
return ItemStack.loadItemStackFromNBT(ItemDataUtils.getCompound(bin, "storedItem"));
}
public void setItemType(ItemStack stack)
{
if(stack == null)
{
ItemDataUtils.removeData(bin, "storedItem");
return;
}
ItemDataUtils.setCompound(bin, "storedItem", StackUtils.size(stack, 1).writeToNBT(new NBTTagCompound()));
}
}