package com.gmail.nuclearcat1337.kits;
import java.util.ArrayList;
import java.util.List;

import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;

import com.gmail.nuclearcat1337.anniPro.anniGame.AnniPlayer;
import com.gmail.nuclearcat1337.anniPro.kits.KitUtils;
import com.gmail.nuclearcat1337.anniPro.kits.Loadout;
import com.gmail.nuclearcat1337.base.SpecialItemKit;

public class Swapper extends SpecialItemKit
{
	@Override
	protected void onInitialize()
	{
	}

	@Override
	protected ItemStack specialItem()
	{
		ItemStack swapper = KitUtils.addSoulbound(new ItemStack(Material.GREEN_RECORD));
		ItemMeta meta = swapper.getItemMeta();
		meta.setDisplayName(getSpecialItemName()+" "+ChatColor.GREEN+"READY");
		swapper.setItemMeta(meta);	
		return swapper;
	}

	@Override
	protected String defaultSpecialItemName()
	{
		return ChatColor.AQUA+"Swapper";
	}

	@Override
	protected boolean isSpecialItem(ItemStack stack)
	{
		if(stack != null && stack.hasItemMeta() && stack.getItemMeta().hasDisplayName())
		{
			String name = stack.getItemMeta().getDisplayName();
			if(name.contains(getSpecialItemName()) && KitUtils.isSoulbound(stack))
				return true;
		}
		return false;
	}	

	//TODO----Apparently this also switches with teammates
	@Override
	protected boolean performSpecialAction(Player player, AnniPlayer p)
	{
		if(p.getTeam() != null)
		{
			Player e = instance.getPlayerInSightTest(player, 15);
			if(e != null)
			{
				AnniPlayer pl = AnniPlayer.getPlayer(e.getUniqueId());
				if(pl != null && !pl.getTeam().equals(p.getTeam()))
				{
					Location playerLoc = player.getLocation().clone();
					Location entityLoc = e.getLocation().clone();
					
					Vector playerLook = playerLoc.getDirection();
					Vector playerVec = playerLoc.toVector();
					Vector entityVec = entityLoc.toVector();
					Vector toVec = playerVec.subtract(entityVec).normalize();
					
					e.teleport(playerLoc.setDirection(playerLook.normalize()));
					player.teleport(entityLoc.setDirection(toVec));
					e.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 3, 1));
					return true;
				}
			}	
		}
		return false;
	}

	@Override
	protected long getDelayLength()
	{
		return 20000;
	}

	@Override
	protected String getInternalName()
	{
		return "Swapper";
	}

	@Override
	protected ItemStack getIcon()
	{
		return new ItemStack(Material.GREEN_RECORD);
	}

	@Override
	protected List<String> getDefaultDescription()
	{
		List<String> l = new ArrayList<String>();
		addToList(l,new String[]
				{
					aqua+"The swapper is able to",
					aqua+"swap places with a nearby",
					aqua+"enemy every 20 seconds.",
					"",
					aqua+"The enemy that is swapped",
					aqua+"has slowness 2 applied",
					aqua+"for three seconds.",
					"",
					aqua+"The swapper is a team",
					aqua+"based ganking class that",
					aqua+"is best suited for players",
					aqua+"moving in groups and can",
					aqua+"be used to bring enemies",
					aqua+"to a location or bring",
					aqua+"yourself to a more advantageous",
					aqua+"position once held by",
					aqua+"your enemy.",
				});
		return l;
	}

	@Override
	public void cleanup(Player arg0)
	{
	}

//	@Override
//	public void onPlayerSpawn(Player player)
//	{
//		KitUtils.giveTeamArmor(player);
//		player.getInventory().addItem(KitUtils.getWoodSword());
//		player.getInventory().addItem(KitUtils.getWoodPick());
//		player.getInventory().addItem(KitUtils.getWoodAxe());
//		super.giveSpecialItem(player);
//		player.getInventory().addItem(KitUtils.getNavCompass());
//	}
	
	@Override
	protected Loadout getFinalLoadout()
	{
		return new Loadout().addWoodSword().addWoodPick().addWoodAxe().addItem(super.getSpecialItem());
	}

	@Override
	protected boolean useDefaultChecking()
	{
		return true;
	}
	
}
//	private ItemStack swapperItem;
//	private String swapperItemName;
//
//	@Override
//	public void Initialize() 
//	{
//		ConfigurationSection sec = KitConfig.getInstance().getKitSection("Swapper");
//		this.loadKitStuff(sec);
//		this.swapperItemName = sec.getString("SwapperItemName");
//		this.setIcon(new ItemStack(Material.GREEN_RECORD));
//		swapperItem = KitUtils.addSoulbound(new ItemStack(Material.GREEN_RECORD));
//		
//		ItemMeta meta = swapperItem.getItemMeta();
//		meta.setDisplayName(swapperItemName+" "+ChatColor.GREEN+"READY");
//		Delays.getInstance().createNewDelay("Swapper", new StandardItemUpdater(swapperItemName,Material.GREEN_RECORD,new Function<ItemStack,Boolean>(){
//
//			@Override
//			public Boolean apply(ItemStack staack)
//			{
//				return isSwapperItem(staack);
//			}}));
//		swapperItem.setItemMeta(meta);
//		
//	}
//	
//	private boolean isSwapperItem(ItemStack stack)
//	{
//		if(stack != null && stack.hasItemMeta() && stack.getItemMeta().hasDisplayName())
//		{
//			String name = stack.getItemMeta().getDisplayName();
//			if(name.contains(swapperItemName) && KitUtils.isSoulbound(stack))
//				return true;
//		}
//		return false;
//	}
//
//	//TODO-----Remove
//	@Override
//	public boolean hasPermission(Player arg0)
//	{
//		// TODO Auto-generated method stub
//		return false;
//	}
//
//	@Override
//	public void cleanup(Player player) 
//	{
//
//	}
//
//	@Override
//	public void onPlayerSpawn(Player player)
//	{
//		player.getInventory().addItem(KitUtils.WoodSword);
//		player.getInventory().addItem(KitUtils.WoodPick);
//		player.getInventory().addItem(KitUtils.WoodAxe);
//		player.getInventory().addItem(swapperItem); //Give the record for switching
//	}
//	
//	//TODO---need to implement extra damage when the player has 40% of health or less
//	
//	//checks for player death and increments max health
////	@EventHandler(priority = EventPriority.MONITOR)
////	public void damageListener(final PlayerDeathEvent event)
////	{
////	}