package drzhark.mocreatures.entity.passive;

import drzhark.mocreatures.MoCTools;
import drzhark.mocreatures.MoCreatures;
import drzhark.mocreatures.entity.MoCEntityAnimal;
import drzhark.mocreatures.entity.item.MoCEntityEgg;
import drzhark.mocreatures.entity.monster.MoCEntityScorpion;
import drzhark.mocreatures.network.MoCServerPacketHandler;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class MoCEntityPetScorpion extends MoCEntityAnimal {
    public static final String scorpionNames[] = { "Dirt", "Cave", "Nether", "Frost", "Undead" };
    private boolean isPoisoning;
    private int poisontimer;
    public int mouthCounter;
    public int armCounter;
    private int hideCounter;
    //public boolean cheated;

    public MoCEntityPetScorpion(World world)
    {
        super(world);
        setSize(1.4F, 0.9F);
        health = 15;
        poisontimer = 0;
        setAdult(false);
        setEdad(20);
        roper = null;
        setHasBabies(false);
        //cheated = true;
        this.stepHeight = 1.0F;

    }

    @Override
    public void selectType()
    {
        if (getType() == 0)
        {
            setType(1);

        }

    }

    @Override
    public String getTexture()
    {

        boolean saddle = getIsRideable();
        switch (getType())
        {
        case 1:
            if (!saddle) { return MoCreatures.proxy.MODEL_TEXTURE + "scorpiondirt.png"; }
            return MoCreatures.proxy.MODEL_TEXTURE + "scorpiondirtsaddle.png";
        case 2:
            if (!saddle) { return MoCreatures.proxy.MODEL_TEXTURE + "scorpioncave.png"; }
            return MoCreatures.proxy.MODEL_TEXTURE + "scorpioncavesaddle.png";
        case 3:
            if (!saddle) { return MoCreatures.proxy.MODEL_TEXTURE + "scorpionnether.png"; }
            return MoCreatures.proxy.MODEL_TEXTURE + "scorpionnethersaddle.png";
        case 4:
            if (!saddle) { return MoCreatures.proxy.MODEL_TEXTURE + "scorpionfrost.png"; }
            return MoCreatures.proxy.MODEL_TEXTURE + "scorpionfrostsaddle.png";

        case 5:
            if (!saddle) { return MoCreatures.proxy.MODEL_TEXTURE + "scorpionundead.png"; }
            return MoCreatures.proxy.MODEL_TEXTURE + "scorpionundeadsaddle.png";

        default:
            return MoCreatures.proxy.MODEL_TEXTURE + "scorpiondirt.png";
        }

    }

    @Override
    protected void entityInit()
    {
        super.entityInit();
        dataWatcher.addObject(22, Byte.valueOf((byte) 0)); // isRideable - 0 false 1 true
        dataWatcher.addObject(23, Byte.valueOf((byte) 0)); // has babies - 0 false 1 true
        dataWatcher.addObject(24, Byte.valueOf((byte) 0)); // isPicked - 0 false 1 true

    }

    public boolean getIsRideable()
    {
        return (dataWatcher.getWatchableObjectByte(22) == 1);
    }

    public boolean getHasBabies()
    {
        //return true;
        return getIsAdult() && (dataWatcher.getWatchableObjectByte(23) == 1);
    }

    public boolean getIsPicked()
    {
        return (dataWatcher.getWatchableObjectByte(24) == 1);
    }

    public boolean getIsPoisoning()
    {
        return isPoisoning;
        //return (dataWatcher.getWatchableObjectByte(23) == 1);
    }

    public void setRideable(boolean flag)
    {
        // if (worldObj.isRemote) return;
        byte input = (byte) (flag ? 1 : 0);
        dataWatcher.updateObject(22, Byte.valueOf(input));
    }

    public void setHasBabies(boolean flag)
    {
        //if (worldObj.isRemote) return;
        byte input = (byte) (flag ? 1 : 0);
        dataWatcher.updateObject(23, Byte.valueOf(input));
    }

    public void setPicked(boolean flag)
    {
        //if (worldObj.isRemote) return;
        byte input = (byte) (flag ? 1 : 0);
        dataWatcher.updateObject(24, Byte.valueOf(input));
    }

    public void setPoisoning(boolean flag)
    {
        if (flag && MoCreatures.isServer())
        {
            MoCServerPacketHandler.sendAnimationPacket(this.entityId, this.worldObj.provider.dimensionId, 0);
        }
        isPoisoning = flag;
    }

    @Override
    public void performAnimation(int animationType)
    {
        if (animationType == 0) //tail animation
        {
            setPoisoning(true);
        }
        else if (animationType == 1) //arm swinging
        {
            armCounter = 1;
            //swingArm();
        }
        else if (animationType == 3) //movement of mouth
        {
            mouthCounter = 1;
        }
    }

    @Override
    public int getMaxHealth()
    {
        return 15;
    }

    @Override
    public float getMoveSpeed()
    {
        return 0.8F;
    }

    @Override
    public boolean isOnLadder()
    {
        return isCollidedHorizontally;
    }

    public boolean climbing()
    {
        return !onGround && isOnLadder();
    }

    @Override
    public void onLivingUpdate()
    {
        //if (MoCreatures.isServer())
        //{
        	/*if (cheated)
        	{
        		this.setDead();
        	}*/
            //Riding();
        //}

        if (!onGround && (ridingEntity != null))
        {
            rotationYaw = ridingEntity.rotationYaw;
        }
        if (getIsAdult() && fleeingTick > 0)
        {
            fleeingTick = 0;
        }

        if (mouthCounter != 0 && mouthCounter++ > 50)
        {
            mouthCounter = 0;
        }

        if (MoCreatures.isServer() && (armCounter == 10 || armCounter == 40))
        {
            worldObj.playSoundAtEntity(this, "scorpionclaw", 1.0F, 1.0F + ((rand.nextFloat() - rand.nextFloat()) * 0.2F));
        }

        if (armCounter != 0 && armCounter++ > 24)
        {
            armCounter = 0;
        }

        if (getIsPoisoning())
        {
            poisontimer++;
            if (poisontimer == 1)
            {
                worldObj.playSoundAtEntity(this, "scorpionsting", 1.0F, 1.0F + ((rand.nextFloat() - rand.nextFloat()) * 0.2F));
            }
            if (poisontimer > 50)
            {
                poisontimer = 0;
                setPoisoning(false);
            }
        }

        if (MoCreatures.isServer() && !getIsAdult() && (rand.nextInt(200) == 0))
        {
            setEdad(getEdad() + 1);
            if (getEdad() >= 120)
            {
                setAdult(true);
            }
        }

        super.onLivingUpdate();
    }

    @Override
    public boolean attackEntityFrom(DamageSource damagesource, int i)
    {
        if (super.attackEntityFrom(damagesource, i))
        {
            Entity entity = damagesource.getEntity();
            if ((entity != null) && (entity instanceof EntityPlayer) && getIsTamed()) { return false; }

            if ((entity != null) && (entity != this) && (worldObj.difficultySetting > 0) && getIsAdult())
            {
                entityToAttack = entity;
            }
            return true;
        }
        else
        {
            return false;
        }
    }

    @Override
    protected Entity findPlayerToAttack()
    {
        if (worldObj.difficultySetting > 0 && (!worldObj.isDaytime()) && getIsAdult())// only attacks player at night
        {
            if (!getIsTamed())
            {
                EntityPlayer entityplayer = worldObj.getClosestVulnerablePlayerToEntity(this, 12D);
                if ((entityplayer != null) && getIsAdult()) { return entityplayer; }
            }
            else
            {
                if ((rand.nextInt(80) == 0))
                {
                    EntityLiving entityliving = getClosestEntityLiving(this, 10D);
                    return entityliving;
                }

            }
        }
        return null;
    }

    @Override
    public boolean entitiesToIgnore(Entity entity)
    {
        return ((super.entitiesToIgnore(entity)) || (this.getIsTamed() && entity instanceof MoCEntityScorpion && ((MoCEntityScorpion) entity).getIsTamed()));
    }

    @Override
    protected void attackEntity(Entity entity, float f)
    {
        if ((f > 2.0F) && (f < 6F) && (rand.nextInt(50) == 0))
        {
            if (onGround)
            {
                double d = entity.posX - posX;
                double d1 = entity.posZ - posZ;
                float f1 = MathHelper.sqrt_double((d * d) + (d1 * d1));
                motionX = ((d / f1) * 0.5D * 0.8D) + (motionX * 0.2D);
                motionZ = ((d1 / f1) * 0.5D * 0.8D) + (motionZ * 0.2D);
                motionY = 0.4D;
            }
        }
        else if (attackTime <= 0 && (f < 3.0D) && (entity.boundingBox.maxY > boundingBox.minY) && (entity.boundingBox.minY < boundingBox.maxY))
        {
            attackTime = 20;
            boolean flag = (entity instanceof EntityPlayer);
            if (!getIsPoisoning() && rand.nextInt(5) == 0)
            {
                setPoisoning(true);
                if (getType() <= 2)// regular scorpions
                {
                    if (flag)
                    {
                        MoCreatures.poisonPlayer((EntityPlayer) entity);
                    }
                    ((EntityLiving) entity).addPotionEffect(new PotionEffect(Potion.poison.id, 70, 0));
                }
                else if (getType() == 4)// blue scorpions
                {
                    if (flag)
                    {
                        MoCreatures.freezePlayer((EntityPlayer) entity);
                    }
                    ((EntityLiving) entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 70, 0));

                }
                else if (getType() == 3)// red scorpions
                {
                    if (flag && MoCreatures.isServer() && !worldObj.provider.isHellWorld)
                    {
                        MoCreatures.burnPlayer((EntityPlayer) entity);
                        ((EntityLiving) entity).setFire(15);

                    }

                }

            }
            else
            {
                entity.attackEntityFrom(DamageSource.causeMobDamage(this), 1);
                swingArm();
            }
        }
    }

    public void swingArm()
    {
        if (MoCreatures.isServer())
        {
            MoCServerPacketHandler.sendAnimationPacket(this.entityId, this.worldObj.provider.dimensionId, 1);
        }
    }

    @Override
    public void onUpdate()
    {
        super.onUpdate();
    }

    public boolean swingingTail()
    {
        return getIsPoisoning() && poisontimer < 15;
    }

    @Override
    public void onDeath(DamageSource damagesource)
    {
        super.onDeath(damagesource);

        if (MoCreatures.isServer() && getIsAdult() && getHasBabies())
        {
            int k = rand.nextInt(5);
            for (int i = 0; i < k; i++)
            {

                MoCEntityScorpion entityscorpy = new MoCEntityScorpion(worldObj);
                entityscorpy.setPosition(posX, posY, posZ);
                entityscorpy.setAdult(false);
                entityscorpy.setType(getType());
                worldObj.spawnEntityInWorld(entityscorpy);
                worldObj.playSoundAtEntity(this, "mob.chickenplop", 1.0F, ((rand.nextFloat() - rand.nextFloat()) * 0.2F) + 1.0F);

            }
        }
    }

    @Override
    protected String getDeathSound()
    {
        return "scorpiondying";
    }

    @Override
    protected String getHurtSound()
    {
        return "scorpionhurt";
    }

    @Override
    protected String getLivingSound()
    {
        if (MoCreatures.isServer())
        {
            MoCServerPacketHandler.sendAnimationPacket(this.entityId, this.worldObj.provider.dimensionId, 3);
        }

        return "scorpiongrunt";
    }

    @Override
    protected int getDropItemId()
    {
        if (!getIsAdult()) { return Item.silk.itemID; }

        boolean flag = (rand.nextInt(2) == 0);

        switch (getType())
        {
        case 1:
            if (flag) { return MoCreatures.stingDirt.itemID; }
            return MoCreatures.chitinDirt.itemID;
        case 2:
            if (flag) { return MoCreatures.stingCave.itemID; }
            return MoCreatures.chitinCave.itemID;
        case 3:
            if (flag) { return MoCreatures.stingNether.itemID; }
            return MoCreatures.chitinNether.itemID;
        case 4:
            if (flag) { return MoCreatures.stingFrost.itemID; }
            return MoCreatures.chitinFrost.itemID;
        case 5:
            return Item.rottenFlesh.itemID;

        default:
            return Item.silk.itemID;
        }
    }

    @Override
    public boolean interact(EntityPlayer entityplayer)
    {
        if (super.interact(entityplayer)) { return false; }

        ItemStack itemstack = entityplayer.inventory.getCurrentItem();
        if ((itemstack != null) && getIsAdult() && !getIsRideable() && (itemstack.itemID == Item.saddle.itemID || itemstack.itemID == MoCreatures.horsesaddle.itemID))
        {
            entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
            setRideable(true);
            return true;
        }

        if ((itemstack != null) && this.getIsTamed() && itemstack.itemID == MoCreatures.vialundead.itemID)
        {
            if (--itemstack.stackSize == 0)
            {
                entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, new ItemStack(Item.glassBottle));
            }
            else
            {
                entityplayer.inventory.addItemStackToInventory(new ItemStack(Item.glassBottle));
            }
            setType(5);
            return true;
        }

        if ((itemstack != null) && this.getIsTamed() && itemstack.itemID == MoCreatures.vialdarkness.itemID)
        {
            if (--itemstack.stackSize == 0)
            {
                entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, new ItemStack(Item.glassBottle));
            }
            else
            {
                entityplayer.inventory.addItemStackToInventory(new ItemStack(Item.glassBottle));
            }
            health = getMaxHealth();
            if (MoCreatures.isServer())
            {
                int i = getType() + 40;
                MoCEntityEgg entityegg = new MoCEntityEgg(worldObj, i);
                entityegg.setPosition(entityplayer.posX, entityplayer.posY, entityplayer.posZ);
                entityplayer.worldObj.spawnEntityInWorld(entityegg);
                entityegg.motionY += worldObj.rand.nextFloat() * 0.05F;
                entityegg.motionX += (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.3F;
                entityegg.motionZ += (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.3F;
            }
            return true;
        }
        if (this.ridingEntity == null && !getIsAdult())
        {
            rotationYaw = entityplayer.rotationYaw;
            if (MoCreatures.isServer())
            {
                mountEntity(entityplayer);
            }
            setPicked(true);

            if (MoCreatures.isServer() && !getIsTamed())
            {
                MoCTools.tameWithName((EntityPlayerMP) entityplayer, this);
            }
        }
        else if (this.ridingEntity != null && !getIsAdult())
        {
            worldObj.playSoundAtEntity(this, "mob.chickenplop", 1.0F, ((rand.nextFloat() - rand.nextFloat()) * 0.2F) + 1.0F);
            setPicked(false);
            if (MoCreatures.isServer())
            {
                this.mountEntity(null);
            }
            motionX = entityplayer.motionX * 5D;
            motionY = (entityplayer.motionY / 2D) + 0.5D;
            motionZ = entityplayer.motionZ * 5D;
        }

        if (getIsRideable() && getIsTamed() && getIsAdult() && (riddenByEntity == null))
        {
            entityplayer.rotationYaw = rotationYaw;
            entityplayer.rotationPitch = rotationPitch;
            setEating(false);
            if (MoCreatures.isServer())
            {
                entityplayer.mountEntity(this);
            }

            return true;
        }

        return false;
    }

    @Override
    public double getYOffset()
    {
        if (ridingEntity instanceof EntityPlayer && ridingEntity == MoCreatures.proxy.getPlayer() && !MoCreatures.isServer()) { return (yOffset - 1.7F); }

        if ((ridingEntity instanceof EntityPlayer) && !MoCreatures.isServer())
        {
            return (yOffset - 0.1F);
        }
        else
        {
            return yOffset;
        }
    }

    @Override
    public void readEntityFromNBT(NBTTagCompound nbttagcompound)
    {
        super.readEntityFromNBT(nbttagcompound);
        setHasBabies(nbttagcompound.getBoolean("Babies"));
        setRideable(nbttagcompound.getBoolean("Saddled"));
    }

    @Override
    public void writeEntityToNBT(NBTTagCompound nbttagcompound)
    {
        super.writeEntityToNBT(nbttagcompound);
        nbttagcompound.setBoolean("Babies", getHasBabies());
        nbttagcompound.setBoolean("Saddled", getIsRideable());
    }

    @Override
    public boolean updateMount()
    {
        return getIsTamed();
    }

    @Override
    public boolean forceUpdates()
    {
        return getIsTamed();
    }

    @Override
    public int nameYOffset()
    {

        int n = (int) (1 - (getEdad() * 0.8));
        if (n < -70)
        {
            n = -70;
        }
        
        return n;//(byte) (1 - (getEdad() * 0.8));

    }

    @Override
    public double roperYOffset()
    {
        double r = (double) ((150 - getEdad()) * 0.012D);
        if (r < 0.55D)
        {
            r = 0.55D;
        }
        if (r > 1.2D)
        {
            r = 1.2D;
        }
        
        return r;//(double) ((150 - getEdad()) * 0.0075D);

    }

    @Override
    protected boolean isMyHealFood(ItemStack itemstack)
    {
        return (itemstack.itemID == MoCreatures.ratRaw.itemID || itemstack.itemID == MoCreatures.ratCooked.itemID);
    }

    @Override
    public int getTalkInterval()
    {
        return 300;
    }

    @Override
    protected void fall(float f)
    {
    }

    @Override
    public boolean renderName()
    {
        return getDisplayName() && (riddenByEntity == null) && (ridingEntity == null);
    }

    @Override
    public boolean canBeCollidedWith()
    {

        return riddenByEntity == null;
    }

    @Override
    public boolean rideableEntity()
    {
        return true;
    }

    @Override
    protected boolean isMovementCeased()
    {
        return (riddenByEntity != null);
    }
    
    @Override
    public void dropMyStuff() 
    {
        MoCTools.dropSaddle(this, worldObj);
    }
}