package flaxbeard.cyberware.common.item;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import net.minecraft.enchantment.EnchantmentThorns;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.MobEffects;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EntityDamageSource;
import net.minecraft.util.EntityDamageSourceIndirect;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.ISpecialArmor;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import flaxbeard.cyberware.api.CyberwareAPI;
import flaxbeard.cyberware.api.CyberwareUpdateEvent;
import flaxbeard.cyberware.common.CyberwareContent;
import flaxbeard.cyberware.common.handler.EssentialsMissingHandler;
import flaxbeard.cyberware.common.lib.LibConstants;

public class ItemSkinUpgrade extends ItemCyberware
{

	public ItemSkinUpgrade(String name, EnumSlot slot, String[] subnames)
	{
		super(name, slot, subnames);
		MinecraftForge.EVENT_BUS.register(this);

	}
	
	@SubscribeEvent
	public void handleLivingUpdate(CyberwareUpdateEvent event)
	{
		EntityLivingBase e = event.getEntityLiving();
		ItemStack test = new ItemStack(this, 1, 0);
		if (e.ticksExisted % 20 == 0 && CyberwareAPI.isCyberwareInstalled(e, test))
		{
			if (e.worldObj.canBlockSeeSky(new BlockPos((int) e.posX,(int) (e.posY + e.height),(int) e.posZ)))
			{
				CyberwareAPI.getCapability(e).addPower(getPowerProduction(test), test);
			}
		}
	}
	
	private Map<Integer, Boolean> lastImmuno = new HashMap<Integer, Boolean>();
	private static Map<Integer, Collection<PotionEffect>> potions = new HashMap<Integer, Collection<PotionEffect>>();

	@SubscribeEvent(priority = EventPriority.HIGH)
	public void handleMissingEssentials(CyberwareUpdateEvent event)
	{
		EntityLivingBase e = event.getEntityLiving();
		
		ItemStack test = new ItemStack(this, 1, 3);
		if (CyberwareAPI.isCyberwareInstalled(e, test))
		{
			boolean last = lastImmuno(e);
			boolean powerUsed = e.ticksExisted % 20 == 0 ? CyberwareAPI.getCapability(e).usePower(test, getPowerConsumption(test)) : last;
			
			if (!powerUsed && e instanceof EntityPlayer && e.ticksExisted % 100 == 0 && !e.isPotionActive(CyberwareContent.neuropozyneEffect))
			{
				e.attackEntityFrom(EssentialsMissingHandler.lowessence, 2F);
			}
			
			if (potions.containsKey(e.getEntityId()))
			{
				Collection<PotionEffect> potionsLastActive = potions.get(e.getEntityId());
				Collection<PotionEffect> currentEffects = e.getActivePotionEffects();
				for (PotionEffect cE : currentEffects)
				{
					if (cE.getPotion() == MobEffects.POISON || cE.getPotion() == MobEffects.HUNGER)
					{
						boolean found = false;
						for (PotionEffect lE : potionsLastActive)
						{
							if (lE.getPotion() == cE.getPotion() && lE.getAmplifier() == cE.getAmplifier())
							{
								found = true;
								break;
							}
						}
						
						if (!found)
						{
							e.addPotionEffect(new PotionEffect(cE.getPotion(), (int) (cE.getDuration() * 1.8F), cE.getAmplifier(), cE.getIsAmbient(), cE.doesShowParticles()));
						}
					}
				}
			}
			potions.put(e.getEntityId(), e.getActivePotionEffects());
		}
		else
		{
			lastImmuno.remove(e.getEntityId());
			potions.remove(e.getEntityId());
		}
	}
	
	private boolean lastImmuno(EntityLivingBase e)
	{
		if (!lastImmuno.containsKey(e.getEntityId()))
		{
			lastImmuno.put(e.getEntityId(), true);
		}
		return lastImmuno.get(e.getEntityId());
	}
	
	@Override
	public int getPowerConsumption(ItemStack stack)
	{
		return stack.getItemDamage() == 3 ? LibConstants.IMMUNO_CONSUMPTION : 0;
	}
	

	@SubscribeEvent
	public void handleHurt(LivingHurtEvent event)
	{
		EntityLivingBase e = event.getEntityLiving();

		if (CyberwareAPI.isCyberwareInstalled(e, new ItemStack(this, 1, 1)))
		{
			if (event.getSource() instanceof EntityDamageSource && !(event.getSource() instanceof EntityDamageSourceIndirect))
			{
				for (ItemStack stack : e.getArmorInventoryList())
				{
					if (stack != null && stack.getItem() instanceof ItemArmor)
					{
						if (((ItemArmor) stack.getItem()).getArmorMaterial().getDamageReductionAmount(EntityEquipmentSlot.CHEST) > 4)
						{
							return;
						}
					}
					else if (stack != null && stack.getItem() instanceof ISpecialArmor)
					{
						if (((ISpecialArmor) stack.getItem()).getProperties(e, stack, event.getSource(), event.getAmount(), 1).AbsorbRatio * 25D > 4)
						{
							return;
						}
					}
				}
				
				Random random = e.getRNG();
				Entity attacker = ((EntityDamageSource) event.getSource()).getSourceOfDamage();
				int level = 2;
				if (EnchantmentThorns.shouldHit(3, random))
				{
					if (attacker != null)
					{
						attacker.attackEntityFrom(DamageSource.causeThornsDamage(e), (float) EnchantmentThorns.getDamage(2, random));
					}
				}
			}
		}
	}
	
	
	@Override
	public int getPowerProduction(ItemStack stack)
	{
		return stack.getItemDamage() == 0 ? LibConstants.SOLAR_PRODUCTION : 0;
	}
}