package mods.ocminecart.common.container;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import li.cil.oc.api.internal.TextBuffer;
import li.cil.oc.api.network.ManagedEnvironment;
import mods.ocminecart.common.container.slots.ContainerSlot;
import mods.ocminecart.common.minecart.ComputerCart;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ComputerCartContainer extends Container {
public static final int YSIZE_SCR = 256;
public static final int YSIZE_NOSCR = 108;
public static final int XSIZE = 256;
public static final int DELTA = YSIZE_SCR - YSIZE_NOSCR;
private ComputerCart entity;
private boolean hasScreen=false;
public int smaxEnergy = -1;
public int sEnergy = -1;
public int sizeinv = -1;
public int selSlot = -1;
public boolean updatesize = false;
public ComputerCartContainer(InventoryPlayer inventory,ComputerCart entity) {
this.entity=entity;
this.initComponents(this.entity.getCompinv().getComponents());
this.addSlotToContainer(new ContainerSlot(entity.compinv, 20 , 188,232 - ((this.hasScreen) ? 0 : DELTA), entity.compinv.getContainer(0)));
this.addSlotToContainer(new ContainerSlot(entity.compinv, 21 , 206,232 - ((this.hasScreen) ? 0 : DELTA), entity.compinv.getContainer(1)));
this.addSlotToContainer(new ContainerSlot(entity.compinv, 22 , 224,232 - ((this.hasScreen) ? 0 : DELTA), entity.compinv.getContainer(2)));
for(int i=0;i<entity.maininv.getMaxSizeInventory();i+=1){
this.addSlotToContainer(new Slot(entity.maininv, i, -10000, -10000));
}
this.addPlayerInv(6, 174 -((this.hasScreen) ? 0 : DELTA), inventory);
}
private void initComponents(Iterable<ManagedEnvironment> iterable){
Iterator<ManagedEnvironment> list = iterable.iterator();
while(list.hasNext()){
ManagedEnvironment env = list.next();
if(env instanceof TextBuffer) this.hasScreen=true;
}
}
@Override
public boolean canInteractWith(EntityPlayer player) {
return player.getDistanceToEntity(entity)<=64;
}
private void addPlayerInv(int x,int y, InventoryPlayer inventory){
for(int i=0;i<9;i++){
this.addSlotToContainer(new Slot(inventory, i, x+i*18, y+58));
}
for(int i=0;i<3;i++){
for(int j=0;j<9;j++){
this.addSlotToContainer(new Slot(inventory, j+i*9+9, x+j*18, y+i*18));
}
}
}
public ItemStack transferStackInSlot(EntityPlayer player, int slot){
Slot s = this.getSlot(slot);
if(s==null || !s.getHasStack()) return null;
ItemStack stack = s.getStack();
List<Integer> a = getPlayerInvSlots(stack,player);
List<Integer> b = getCartInvSlots(stack);
if(s.inventory.equals(player.inventory)){
for(int sl : b){
transferToSlot(sl,stack);
if(stack.stackSize<1){
s.putStack(null);
return null;
}
}
for(int sl : a){
transferToSlot(sl,stack);
if(stack.stackSize<1){
s.putStack(null);
return null;
}
}
}
else{
for(int sl : a){
transferToSlot(sl,stack);
if(stack.stackSize<1){
s.putStack(null);
return null;
}
}
for(int sl : b){
transferToSlot(sl,stack);
if(stack.stackSize<1){
s.putStack(null);
return null;
}
}
}
if(stack==null || stack.stackSize<1) s.putStack(null);
return (stack==null || stack.stackSize<1) ? null : stack;
}
private List<Integer> getCartInvSlots(ItemStack stack){
ArrayList<Integer> slots = new ArrayList<Integer>();
for(Slot slot : (List<Slot>)this.inventorySlots){
if(slot.inventory.equals(this.entity.maininv) || slot.inventory.equals(this.entity.compinv)){
slots.add(slot.slotNumber);
}
}
return sortSlots(stack,slots);
}
private List<Integer> getPlayerInvSlots(ItemStack stack, EntityPlayer player){
ArrayList<Integer> slots = new ArrayList<Integer>();
for(Slot slot : (List<Slot>)this.inventorySlots){
if(slot.inventory.equals(player.inventory)){
slots.add(slot.slotNumber);
}
}
return sortSlots(stack,slots);
}
private List<Integer> sortSlots(ItemStack stack, List<Integer> slots){
ArrayList<Integer> res = new ArrayList<Integer>();
for(int slot : slots){
Slot s = this.getSlot(slot);
if(s.getHasStack() && s.getStack().isItemEqual(stack)){
res.add(slot);
}
}
for(int slot : slots){
Slot s = this.getSlot(slot);
if(!s.getHasStack() || !s.getStack().isItemEqual(stack)){
res.add(slot);
}
}
return res;
}
private void transferToSlot(int slotindex, ItemStack stack){
Slot slot = this.getSlot(slotindex);
if(slot == null || !slot.isItemValid(stack) || stack == null || stack.stackSize < 1) return;
if(slot.getHasStack() && !slot.getStack().isItemEqual(stack)) return;
int max = Math.min(slot.getSlotStackLimit(), Math.min(slot.inventory.getInventoryStackLimit(), stack.getMaxStackSize()));
int cur = (slot.getHasStack()) ? slot.getStack().stackSize : 0;
int transfer = max - cur;
transfer = Math.min(stack.stackSize, transfer);
if(transfer > 0){
ItemStack sstack = stack.copy();
sstack.stackSize = transfer + cur;
slot.putStack(sstack);
stack.stackSize-=transfer;
}
return;
}
public ComputerCart getEntity(){
return this.entity;
}
public boolean getHasScreen(){
return this.hasScreen;
}
public void addCraftigToICrafters(ICrafting craft){
super.addCraftingToCrafters(craft);
craft.sendProgressBarUpdate(this, 0, (int) this.entity.getCurEnergy());
craft.sendProgressBarUpdate(this, 1, (int) this.entity.getMaxEnergy());
craft.sendProgressBarUpdate(this, 2, this.entity.getInventorySpace());
craft.sendProgressBarUpdate(this, 3, this.entity.selectedSlot());
}
public void detectAndSendChanges(){
super.detectAndSendChanges();
if(this.entity.worldObj.isRemote) return;
for(int i=0;i<this.crafters.size();i+=1){
ICrafting craft = (ICrafting) this.crafters.get(i);
if(this.entity.getCurEnergy() != this.sEnergy){
craft.sendProgressBarUpdate(this, 0, (int) (this.entity.getCurEnergy()));
}
if(this.entity.getMaxEnergy() != this.smaxEnergy){
craft.sendProgressBarUpdate(this, 1, (int) (this.entity.getMaxEnergy()));
}
if(this.entity.getInventorySpace() != this.sizeinv){
craft.sendProgressBarUpdate(this, 2, this.entity.getInventorySpace());
}
if(this.entity.selectedSlot() != this.selSlot){
craft.sendProgressBarUpdate(this, 3, this.entity.selectedSlot());
}
}
this.smaxEnergy=(int) this.entity.getMaxEnergy();
this.sEnergy=(int) this.entity.getCurEnergy();
this.sizeinv=this.entity.getInventorySpace();
this.selSlot = this.entity.selectedSlot();
}
@SideOnly(Side.CLIENT)
public void updateProgressBar(int updateid, int value){
switch(updateid){
case 0:
this.sEnergy = value;
break;
case 1:
this.smaxEnergy = value;
break;
case 2:
this.updatesize = true;
this.sizeinv = value;
break;
case 3:
this.selSlot = value;
break;
}
}
}