package com.minemaarten.advancedmod.inventory;

import java.util.List;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;

import com.minemaarten.advancedmod.network.MessageHandleTextUpdate;
import com.minemaarten.advancedmod.network.NetworkHandler;
import com.minemaarten.advancedmod.tileentity.TileEntityCamoMine;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ContainerCamoMine extends ContainerAdvancedMod{
    private final TileEntityCamoMine te;
    private int lastTimer = -1;
    private String lastTarget = "";

    public ContainerCamoMine(InventoryPlayer playerInventory, TileEntityCamoMine te){

        addSlotToContainer(new SlotCamouflage(te, 0, 80, 58));
        addSlotToContainer(new SlotCamouflage(te, 1, 80, 22));
        addSlotToContainer(new SlotCamouflage(te, 2, 80, 40));
        addSlotToContainer(new SlotCamouflage(te, 3, 62, 40));
        addSlotToContainer(new SlotCamouflage(te, 4, 98, 40));
        addSlotToContainer(new SlotCamouflage(te, 5, 102, 18));

        addPlayerSlots(playerInventory, 8, 84);
        this.te = te;
    }

    @Override
    public boolean canInteractWith(EntityPlayer player){
        return te.isUseableByPlayer(player);
    }

    @Override
    public void detectAndSendChanges(){
        super.detectAndSendChanges();
        if(lastTimer != te.getTimer()) {
            for(ICrafting crafter : (List<ICrafting>)crafters) {
                crafter.sendProgressBarUpdate(this, 0, te.getTimer());
            }
            lastTimer = te.getTimer();
        }
        if(!lastTarget.equals(te.getTarget())) {
            for(Object crafter : crafters) {
                if(crafter instanceof EntityPlayerMP) {
                    NetworkHandler.sendTo(new MessageHandleTextUpdate(te, 0, te.getTarget()), (EntityPlayerMP)crafter);
                }
            }
            lastTarget = te.getTarget();
        }
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void updateProgressBar(int id, int value){
        super.updateProgressBar(id, value);
        if(id == 0) {
            te.setTimer(value);
        }
    }

    /**
     * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
     */
    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex){
        ItemStack itemstack = null;
        Slot slot = (Slot)inventorySlots.get(slotIndex);

        if(slot != null && slot.getHasStack()) {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();

            //From here change accordingly...
            if(slotIndex < 6) {
                if(!mergeItemStack(itemstack1, 6, 42, true)) {
                    return null;
                }
            } else {
                //Shift click single items only.
                if(itemstack1.stackSize == 1) {
                    for(int i = 0; i < 6; i++) {
                        Slot shiftedInSlot = (Slot)inventorySlots.get(i);
                        if(!shiftedInSlot.getHasStack() && shiftedInSlot.isItemValid(itemstack1)) mergeItemStack(itemstack1, i, i + 1, false);
                    }
                }
            }
            //...till here.

            if(itemstack1.stackSize == 0) {
                slot.putStack((ItemStack)null);
            } else {
                slot.onSlotChanged();
            }

            if(itemstack1.stackSize == itemstack.stackSize) {
                return null;
            }

            slot.onPickupFromSlot(player, itemstack1);
        }

        return itemstack;
    }
}