package codechicken.lib.inventory;

import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;

/**
 * Inventory wrapper for unified ISided/IInventory access
 */
public class InventoryRange
{
    public IInventory inv;
    public EnumFacing face;
    public ISidedInventory sidedInv;
    public int[] slots;
    
    public InventoryRange(IInventory inv, int side)
    {
        this.inv = inv;
        this.face = EnumFacing.values()[side];
        if(inv instanceof ISidedInventory)
        {
            sidedInv = (ISidedInventory)inv;
            slots = sidedInv.getSlotsForFace(face);
        }
        else
        {
            slots = new int[inv.getSizeInventory()];
            for(int i = 0; i < slots.length; i++)
                slots[i] = i;
        }
    }

    public InventoryRange(IInventory inv)
    {
        this(inv, 0);
    }
    
    public InventoryRange(IInventory inv, int fslot, int lslot)
    {
        this.inv = inv;
        slots = new int[lslot-fslot];
        for(int i = 0; i < slots.length; i++)
            slots[i] = fslot+i;
    }

    public InventoryRange(IInventory inv, InventoryRange access)
    {
        this.inv = inv;
        this.slots = access.slots;
        this.face = access.face;
        if(inv instanceof ISidedInventory)
            sidedInv = (ISidedInventory) inv;
    }

    public boolean canInsertItem(int slot, ItemStack item)
    {
        return sidedInv == null ? inv.isItemValidForSlot(slot, item) : sidedInv.canInsertItem(slot, item, face);
    }
    
    public boolean canExtractItem(int slot, ItemStack item)
    {
        return sidedInv == null ? inv.isItemValidForSlot(slot, item) : sidedInv.canExtractItem(slot, item, face);
    }

    public int lastSlot()
    {
        int last = 0;
        for(int slot : slots)
            if(slot > last)
                last = slot;
        return last;
    }
}