package drzhark.mocreatures.item;

import drzhark.mocreatures.MoCTools;
import drzhark.mocreatures.MoCreatures;
import drzhark.mocreatures.entity.MoCEntityAnimal;
import drzhark.mocreatures.entity.MoCIMoCreature;
import drzhark.mocreatures.entity.passive.MoCEntityHorse;
import drzhark.mocreatures.network.MoCServerPacketHandler;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;

public class MoCItemAmulet extends MoCItem {

    public MoCItemAmulet(int i)
    {
        super(i);
        maxStackSize = 1;
        setHasSubtypes(true);
        ageCounter = 0;
    }

    
    
    @Override
    public ItemStack onItemRightClick(ItemStack itemstack, World worldObj, EntityPlayer entityplayer)
    {
        if (++ageCounter < 2) { return itemstack; }
        
        int i = itemstack.getItemDamage();
        

        
        if (i == 0)
        {
            //System.out.println("cheated amulet");
            //i = 58;
        }

        if (MoCreatures.isServer())
        {
        	
        	if( itemstack.stackTagCompound == null )
    		{
        		itemstack.setTagCompound(new NBTTagCompound());
    		}
    		NBTTagCompound nbtcompound = itemstack.stackTagCompound;
    		readFromNBT(nbtcompound);
    		/*
    		System.out.println("reading spawnclass = " + spawnClass);
    		System.out.println("reading Health = " + health);
    		System.out.println("reading Edad = " + edad);
    		System.out.println("reading Name = " + name);
    		System.out.println("reading Rideable = " + rideable);
    		System.out.println("reading Armor = " + armor);
    		System.out.println("reading CreatureType = " + creatureType);
    		*/
    		
        }
        
        if (spawnClass == 21 || spawnClass == 0) // horses or old amulets
        {
        	//dirty fix for old amulets
        	spawnClass = 22;
        	if (spawnClass == 0 || creatureType == 0)
        	{
        		creatureType = i;
        		spawnClass = 22;
        		edad = 100;
        		health = 20;
        		armor = 0;
        		name = "";
        		ownerName = "";
        		rideable = false;
        		adult = true;
        	}
        	//gives an empty amulet
        	if (creatureType == 26 || creatureType == 27 || creatureType == 28)
        	{
        		entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, new ItemStack(MoCreatures.amuletbone, 1, 0));
        	}
        	else if (creatureType == 21 || creatureType == 22)
        	{
        		entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, new ItemStack(MoCreatures.amuletghost, 1, 0));
        	}
        	else if ((creatureType > 47 && creatureType < 60))
        	{
        		entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, new ItemStack(MoCreatures.amuletfairy, 1, 0));
        	}
        	else if (creatureType == 39 || creatureType == 40)
        	{
        		entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, new ItemStack(MoCreatures.amuletpegasus, 1, 0));
        	}
        }

        if (i != 0)
        {

            double dist = 3D;
            double newPosY = entityplayer.posY;
            double newPosX = entityplayer.posX - (dist * Math.cos((MoCTools.realAngle(entityplayer.rotationYaw - 90F)) / 57.29578F));
            double newPosZ = entityplayer.posZ - (dist * Math.sin((MoCTools.realAngle(entityplayer.rotationYaw - 90F)) / 57.29578F));

            if (MoCreatures.isServer())
            {
        		try
        		{
        			MoCEntityAnimal storedCreature = MoCTools.spawnMoCAnimalList(spawnClass, worldObj);
                    storedCreature.setPosition(newPosX, newPosY, newPosZ);
            		storedCreature.setType(creatureType);
            		storedCreature.setTamed(true);
            		storedCreature.setRideable(rideable);
            		storedCreature.setEdad(edad);
            		storedCreature.setName(name);
            		storedCreature.setArmorType(armor);
            		storedCreature.setEntityHealth(health);
            		storedCreature.setAdult(adult);
            		
            		//if the player using the amulet is different than the original owner
            		if (MoCreatures.proxy.enableOwnership && ownerName != "" && !(ownerName.equals(entityplayer.username)) )
      				{
      					EntityPlayer epOwner = worldObj.getPlayerEntityByName(ownerName);
      					if (epOwner != null)
      					{
      						MoCTools.reduceTamedByPlayer(epOwner);
      					}
      					else
      					{
      						MoCTools.reduceTamedByOfflinePlayer(ownerName);
      					}
      				}
      				storedCreature.setOwner(entityplayer.username);
                    
                    entityplayer.worldObj.spawnEntityInWorld(storedCreature);
                    MoCServerPacketHandler.sendAppearPacket(storedCreature.entityId, worldObj.provider.dimensionId);
                    MoCTools.playCustomSound(storedCreature, "appearmagic", worldObj);
        		}catch (Exception ex) 
        		{
        			System.out.println("Error spawning creature from amulet " + ex);
        		}
        		
            }
            
            ageCounter = 0;
       }

        return itemstack;
    }

    private int ageCounter;
    //private String owner;
    private String name;
    private int health;
    private int edad;
    private int creatureType;
    private int spawnClass;
    private boolean rideable;
    private byte armor;
    private boolean adult;
    private String ownerName;
    
    public void readFromNBT(NBTTagCompound nbt)
	{
    	this.creatureType = nbt.getInteger("CreatureType");
	    this.health = nbt.getInteger("Health");
	    this.edad = nbt.getInteger("Edad");
	    this.name = nbt.getString("Name");
	    this.spawnClass = nbt.getInteger("SpawnClass");
	    this.rideable = nbt.getBoolean("Rideable");
	    this.armor = nbt.getByte("Armor");
	    this.adult = nbt.getBoolean("Adult");
	    this.ownerName = nbt.getString("OwnerName");
	}
	
	public void writeToNBT(NBTTagCompound nbt)
	{
		nbt.setInteger("CreatureType", this.creatureType);
		nbt.setInteger("Health", this.health);
		nbt.setInteger("Edad", this.edad);
		nbt.setString("Name", this.name);
		nbt.setInteger("SpawnClass", this.spawnClass);
		nbt.setBoolean("Rideable", this.rideable);
		nbt.setByte("Armor", this.armor);
		nbt.setBoolean("Adult", this.adult);
		nbt.setString("OwnerName", this.ownerName);
	}
}