package crazypants.enderio.machine.hypercube;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import com.enderio.core.common.util.InventoryWrapper;
import crazypants.enderio.ModObject;
public class CompositeInventory implements ISidedInventory {
private final List<InvEntry> inventories = new ArrayList<InvEntry>();
private int size = 0;
public void addInventory(CompositeInventory inv) {
for (InvEntry ie : inv.inventories) {
addInventory(ie.inv, ie.side);
}
}
public void addInventory(IInventory inv, ForgeDirection side) {
if(inv == null) {
return;
}
inventories.add(new InvEntry(inv, size, side));
updateSize();
}
public void removeInventory(IInventory inv) {
if(inv == null) {
return;
}
InvEntry remove = null;
for (InvEntry ie : inventories) {
if(ie.inv == inv || ie.origInv == inv) {
remove = ie;
break;
}
}
if(remove != null) {
inventories.remove(remove);
updateSize();
}
}
private void updateSize() {
size = 0;
for (InvEntry inv : inventories) {
if(inv != null && inv.inv != null) {
inv.startIndex = size;
inv.endIndex = inv.startIndex + inv.inv.getSizeInventory() - 1;
size += inv.inv.getSizeInventory();
}
}
}
@Override
public int getSizeInventory() {
return size;
}
@Override
public ItemStack getStackInSlot(int i) {
for (InvEntry inv : inventories) {
if(inv.containsSlot(i)) {
return inv.inv.getStackInSlot(inv.getSlot(i));
}
}
return null;
}
@Override
public ItemStack decrStackSize(int slot, int j) {
for (InvEntry inv : inventories) {
if(inv.containsSlot(slot)) {
return inv.inv.decrStackSize(inv.getSlot(slot), j);
}
}
return null;
}
@Override
public void setInventorySlotContents(int slot, ItemStack itemStack) {
for (InvEntry inv : inventories) {
if(inv.containsSlot(slot)) {
inv.inv.setInventorySlotContents(inv.getSlot(slot), itemStack);
return;
}
}
}
@Override
public int[] getAccessibleSlotsFromSide(int var1) {
List<Integer> resList = new ArrayList<Integer>();
for (InvEntry inv : inventories) {
int[] slots = inv.inv.getAccessibleSlotsFromSide(inv.side.ordinal());
if(slots != null) {
for (int i = 0; i < slots.length; i++) {
resList.add(slots[i]);
}
}
}
int[] result = new int[resList.size()];
for (int i = 0; i < result.length; i++) {
result[i] = resList.get(i);
}
return result;
}
@Override
public boolean canInsertItem(int slot, ItemStack item, int side) {
for (InvEntry inv : inventories) {
if(inv != null && inv.containsSlot(slot)) {
return inv.inv.canInsertItem(inv.getSlot(slot), item, side);
}
}
return false;
}
@Override
public boolean canExtractItem(int slot, ItemStack item, int side) {
for (InvEntry inv : inventories) {
if(inv != null && inv.containsSlot(slot)) {
return inv.inv.canExtractItem(inv.getSlot(slot), item, side);
}
}
return false;
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack item) {
for (InvEntry inv : inventories) {
if(inv != null && inv.containsSlot(slot)) {
return inv.inv.isItemValidForSlot(inv.getSlot(slot), item);
}
}
return false;
}
@Override
public void markDirty() {
for (InvEntry inv : inventories) {
if(inv != null) {
inv.inv.markDirty();
}
}
}
//---------------- Inventory
@Override
public String getInventoryName() {
return ModObject.blockHyperCube.unlocalisedName;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer) {
return false;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public ItemStack getStackInSlotOnClosing(int i) {
return null;
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
private static class InvEntry {
IInventory origInv;
ISidedInventory inv;
int startIndex;
int endIndex;
ForgeDirection side;
InvEntry(IInventory inventory, int startIndex, ForgeDirection side) {
this.origInv = inventory;
inv = InventoryWrapper.asSidedInventory(inventory);
this.endIndex = startIndex + inv.getSizeInventory() - 1;
this.side = side;
}
boolean containsSlot(int index) {
return index >= startIndex && index <= endIndex;
}
int getSlot(int index) {
return index - startIndex;
}
}
}