package com.gmail.nuclearcat1337.kits;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.inventory.ItemStack;

import com.gmail.nuclearcat1337.anniPro.anniGame.AnniPlayer;
import com.gmail.nuclearcat1337.anniPro.anniGame.Game;
import com.gmail.nuclearcat1337.anniPro.kits.Loadout;
import com.gmail.nuclearcat1337.base.ConfigurableKit;
import com.gmail.nuclearcat1337.base.DelayUpdate;
import com.gmail.nuclearcat1337.base.Delays;

public class Acrobat extends ConfigurableKit
{
	//private final ItemStack Arrows = KitUtils.addSoulbound(new ItemStack(Material.ARROW,6));
	
	@Override
	protected void setUp()
	{
		final Acrobat k = this;
		Delays.getInstance().createNewDelay(getInternalName(), new DelayUpdate(){
			@Override
			public void update(Player player, int secondsLeft)
			{
				if(secondsLeft <= 0)
				{
					AnniPlayer p = AnniPlayer.getPlayer(player.getUniqueId());
					if(p != null && p.getKit().equals(k))
					{
						player.playSound(player.getLocation(), Sound.WITHER_SHOOT, 1.0F, 2.0F);
						player.setAllowFlight(true);
					}
				}
			}});
	}

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

	@Override
	protected ItemStack getIcon()
	{
		return new ItemStack(Material.FEATHER);
	}
	
	@Override
	protected int setDefaults(ConfigurationSection section)
	{
		return 0;
	}

	@Override
	protected List<String> getDefaultDescription()
	{
		List<String> l = new ArrayList<String>();
		addToList(l,new String[]
				{
					aqua+"You are the bird.", 
					"",
					aqua+"Soar through the air with",
					aqua+"grace. You are immune",
					aqua+"to fall damage.",
					"",
					aqua+"Your stamina allows you",
					aqua+"to sprint longer than",
					aqua+"others.",
				});
		return l;
	}

//	@Override
//	public void onPlayerSpawn(Player player)
//	{
//		KitUtils.giveTeamArmor(player);
//		player.getInventory().addItem(KitUtils.getWoodSword());
//		player.getInventory().addItem(KitUtils.getWoodPick());
//		player.getInventory().addItem(KitUtils.getWoodAxe());
//		player.getInventory().addItem(KitUtils.getBow());
//		player.getInventory().addItem(Arrows.clone());
//		player.getInventory().addItem(KitUtils.getNavCompass());
//	}
	
	@Override
	protected Loadout getFinalLoadout()
	{
		return new Loadout().addWoodSword().addWoodPick().addWoodAxe().addBow().addSoulboundItem(new ItemStack(Material.ARROW,6));
	}

	@Override
	public void cleanup(Player player)
	{
		assert player != null;
		
		player.setAllowFlight(false);
		player.setFlying(false);
	}
	
	@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
	public void AcrobatDoubleJump(PlayerToggleFlightEvent event) 
	{  
		Player player = event.getPlayer();
		if(player.getGameMode() != GameMode.CREATIVE) 
		{
			AnniPlayer p = AnniPlayer.getPlayer(player.getUniqueId());
			if(Game.isGameRunning() && p != null && p.getKit().equals(this))
			{
				Delays.getInstance().addDelay(player, System.currentTimeMillis()+10000, this.getInternalName());
			    event.setCancelled(true);
			    player.setAllowFlight(false);
			    player.setFlying(false);		    
			    player.setVelocity(player.getLocation().getDirection().setY(1).multiply(1));
			    player.playSound(player.getLocation(), Sound.ZOMBIE_INFECT, 1.0F, 2.0F);
			}
			else
			{
				player.setAllowFlight(false);
				player.setFlying(false);
			}
		}
	}
	
	@EventHandler(priority = EventPriority.HIGH)
	public void fallDamage(EntityDamageEvent event)
	{
		if(event.getEntity().getType() == EntityType.PLAYER && event.getCause() == DamageCause.FALL)
		{
			Player p = (Player)event.getEntity();
			AnniPlayer pl = AnniPlayer.getPlayer(p.getUniqueId());
			if(pl != null && pl.getKit().equals(this))
			{
				event.setCancelled(true);
			}
		}
	}  
		 
	@EventHandler(priority = EventPriority.HIGHEST)
	public void AcrobatJumpMonitor(PlayerMoveEvent event) 
	{ 
		Player player = event.getPlayer();
		if(player.getGameMode() != GameMode.CREATIVE)
		{
			if(player.isFlying())
			{
				player.setAllowFlight(false);
				player.setFlying(false);
				return;
			}
			
			if(Game.isGameRunning())
			{
				if(!player.getAllowFlight())
				{
					AnniPlayer p = AnniPlayer.getPlayer(player.getUniqueId());
					if(p != null && p.getKit().equals(this))
					{
						if(player.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() != Material.AIR && !Delays.getInstance().hasActiveDelay(player, this.getInternalName()))
						{
							//Bukkit.getLogger().info("Thing 2");
							player.setAllowFlight(true);
							return;
						}
					}
				}
			}
//			else
//			{
//				player.setAllowFlight(false);
//				player.setFlying(false);
//			}
		}
			
			
//		if(player.getGameMode() != GameMode.CREATIVE && player.isFlying())
//		{
//			player.setAllowFlight(false);
//			player.setFlying(false);
//		}
//		
//		if(Game.isGameRunning() && player.getGameMode() != GameMode.CREATIVE && !player.getAllowFlight())
//		{
//			AnniPlayer p = AnniPlayer.getPlayer(player.getUniqueId());
//			if(p != null && p.getKit().equals(this))
//			{
//				//This is possibly also where we would make them able to permanently sprint
//				if(player.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() != Material.AIR && !Delays.getInstance().hasActiveDelay(player, this.getInternalName()))
//				{
//					//Bukkit.getLogger().info("Thing 2");
//					player.setAllowFlight(true);
//					return;
//				}
//			}
//			player.setAllowFlight(false);
//			player.setFlying(false);
//		}
	}
}