package gtPlusPlus.core.slots;

import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.*;
import net.minecraft.stats.AchievementList;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;

public class SlotCrafting extends Slot
{
	/** The craft matrix inventory linked to this result slot. */
	private final IInventory craftMatrix;
	/** The player that is using the GUI where this slot resides. */
	private final EntityPlayer thePlayer;
	/** The number of items that have been crafted so far. Gets passed to ItemStack.onCrafting before being reset. */
	private int amountCrafted;
	private static final String __OBFID = "CL_00001761";

	public SlotCrafting(final EntityPlayer p_i1823_1_, final IInventory p_i1823_2_, final IInventory p_i1823_3_, final int p_i1823_4_, final int p_i1823_5_, final int p_i1823_6_)
	{
		super(p_i1823_3_, p_i1823_4_, p_i1823_5_, p_i1823_6_);
		this.thePlayer = p_i1823_1_;
		this.craftMatrix = p_i1823_2_;
	}

	/**
	 * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
	 */
	@Override
	public boolean isItemValid(final ItemStack p_75214_1_)
	{
		return false;
	}

	/**
	 * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
	 * stack.
	 */
	@Override
	public ItemStack decrStackSize(final int p_75209_1_)
	{
		if (this.getHasStack())
		{
			this.amountCrafted += Math.min(p_75209_1_, this.getStack().stackSize);
		}

		return super.decrStackSize(p_75209_1_);
	}

	/**
	 * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
	 * internal count then calls onCrafting(item).
	 */
	@Override
	protected void onCrafting(final ItemStack p_75210_1_, final int p_75210_2_)
	{
		this.amountCrafted += p_75210_2_;
		this.onCrafting(p_75210_1_);
	}

	/**
	 * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
	 */
	@Override
	protected void onCrafting(final ItemStack p_75208_1_)
	{
		p_75208_1_.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.amountCrafted);
		this.amountCrafted = 0;

		if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.crafting_table))
		{
			this.thePlayer.addStat(AchievementList.buildWorkBench, 1);
		}

		if (p_75208_1_.getItem() instanceof ItemPickaxe)
		{
			this.thePlayer.addStat(AchievementList.buildPickaxe, 1);
		}

		if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.furnace))
		{
			this.thePlayer.addStat(AchievementList.buildFurnace, 1);
		}

		if (p_75208_1_.getItem() instanceof ItemHoe)
		{
			this.thePlayer.addStat(AchievementList.buildHoe, 1);
		}

		if (p_75208_1_.getItem() == Items.bread)
		{
			this.thePlayer.addStat(AchievementList.makeBread, 1);
		}

		if (p_75208_1_.getItem() == Items.cake)
		{
			this.thePlayer.addStat(AchievementList.bakeCake, 1);
		}

		if ((p_75208_1_.getItem() instanceof ItemPickaxe) && (((ItemPickaxe)p_75208_1_.getItem()).func_150913_i() != Item.ToolMaterial.WOOD))
		{
			this.thePlayer.addStat(AchievementList.buildBetterPickaxe, 1);
		}

		if (p_75208_1_.getItem() instanceof ItemSword)
		{
			this.thePlayer.addStat(AchievementList.buildSword, 1);
		}

		if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.enchanting_table))
		{
			this.thePlayer.addStat(AchievementList.enchantments, 1);
		}

		if (p_75208_1_.getItem() == Item.getItemFromBlock(Blocks.bookshelf))
		{
			this.thePlayer.addStat(AchievementList.bookcase, 1);
		}
	}

	@Override
	public void onPickupFromSlot(final EntityPlayer p_82870_1_, final ItemStack p_82870_2_)
	{
		FMLCommonHandler.instance().firePlayerCraftingEvent(p_82870_1_, p_82870_2_, this.craftMatrix);
		this.onCrafting(p_82870_2_);

		for (int i = 0; i < this.craftMatrix.getSizeInventory(); ++i)
		{
			final ItemStack itemstack1 = this.craftMatrix.getStackInSlot(i);

			if (itemstack1 != null)
			{
				this.craftMatrix.decrStackSize(i, 1);

				if (itemstack1.getItem().hasContainerItem(itemstack1))
				{
					final ItemStack itemstack2 = itemstack1.getItem().getContainerItem(itemstack1);

					if ((itemstack2 != null) && itemstack2.isItemStackDamageable() && (itemstack2.getItemDamage() > itemstack2.getMaxDamage()))
					{
						MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(this.thePlayer, itemstack2));
						continue;
					}

					if (!itemstack1.getItem().doesContainerItemLeaveCraftingGrid(itemstack1) || !this.thePlayer.inventory.addItemStackToInventory(itemstack2))
					{
						if (this.craftMatrix.getStackInSlot(i) == null)
						{
							this.craftMatrix.setInventorySlotContents(i, itemstack2);
						}
						else
						{
							this.thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false);
						}
					}
				}
			}
		}
	}
}