package com.hbm.entity.item;

import com.hbm.util.ItemStackUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;

import api.hbm.conveyor.IConveyorPackage;
import api.hbm.conveyor.IEnterableBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;

public class EntityMovingPackage extends EntityMovingConveyorObject implements IConveyorPackage {
	
	protected ItemStack[] contents = new ItemStack[0];

	public EntityMovingPackage(World world) {
		super(world);
		this.setSize(0.5F, 0.5F);
	}

	@Override
	protected void entityInit() { }

	public void setItemStacks(ItemStack[] stacks) {
		this.contents = ItemStackUtil.carefulCopyArray(stacks);
	}

	@Override
	public ItemStack[] getItemStacks() {
		return contents;
	}

	@Override
	public boolean interactFirst(EntityPlayer player) {

		if(!worldObj.isRemote && !this.isDead) {
			
			for(ItemStack stack : contents) {
				if(!player.inventory.addItemStackToInventory(stack.copy())) {
					worldObj.spawnEntityInWorld(new EntityItem(worldObj, posX, posY + 0.125, posZ, stack));
				}
			}
			
			this.setDead();
		}

		return false;
	}

	@Override
	public boolean hitByEntity(Entity attacker) {

		if(!worldObj.isRemote && !this.isDead) {
			this.setDead();
			
			for(ItemStack stack : contents) {
				worldObj.spawnEntityInWorld(new EntityItem(worldObj, posX, posY + 0.125, posZ, stack));
			}
		}
		return false;
	}

	@Override
	public boolean attackEntityFrom(DamageSource source, float amount) {
		this.hitByEntity(source.getEntity());
		return true;
	}

	@Override
	public void enterBlock(IEnterableBlock enterable, BlockPos pos, ForgeDirection dir) {
		if(this.isDead) return;
		
		if(enterable.canPackageEnter(worldObj, pos.getX(), pos.getY(), pos.getZ(), dir, this)) {
			enterable.onPackageEnter(worldObj, pos.getX(), pos.getY(), pos.getZ(), dir, this);
			this.setDead();
		}
	}

	@Override
	public boolean onLeaveConveyor() {
		
		this.setDead();
		
		for(ItemStack stack : contents) {
			EntityItem item = new EntityItem(worldObj, posX + motionX * 2, posY + motionY * 2, posZ + motionZ * 2, stack);
			item.motionX = this.motionX * 2;
			item.motionY = 0.1;
			item.motionZ = this.motionZ * 2;
			item.velocityChanged = true;
			worldObj.spawnEntityInWorld(item);
		}
		
		return true;
	}

	@Override
	protected void writeEntityToNBT(NBTTagCompound nbt) {
		NBTTagList nbttaglist = new NBTTagList();

		for(int i = 0; i < this.contents.length; ++i) {
			if(this.contents[i] != null) {
				NBTTagCompound nbttagcompound1 = new NBTTagCompound();
				nbttagcompound1.setByte("slot", (byte) i);
				this.contents[i].writeToNBT(nbttagcompound1);
				nbttaglist.appendTag(nbttagcompound1);
			}
		}

		nbt.setTag("contents", nbttaglist);
		nbt.setInteger("count", this.contents.length);
	}

	@Override
	protected void readEntityFromNBT(NBTTagCompound nbt) {
		this.contents = new ItemStack[nbt.getInteger("count")];
		NBTTagList nbttaglist = nbt.getTagList("contents", 10);

		for(int i = 0; i < nbttaglist.tagCount(); ++i) {
			NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
			int j = nbttagcompound1.getByte("slot") & 255;

			if(j >= 0 && j < this.contents.length) {
				this.contents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
			}
		}
	}
}
