package com.gmail.nuclearcat1337.base;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;

import com.gmail.nuclearcat1337.anniPro.anniGame.AnniPlayer;
import com.gmail.nuclearcat1337.anniPro.voting.ConfigManager;
import com.google.common.base.Function;


public abstract class SpecialItemKit extends ConfigurableKit
{
	private ItemStack specialItem;
	private String specialItemName;
	protected Delays delays;
	
	@Override
	protected void setUp()
	{
		delays = Delays.getInstance();
		specialItem = specialItem();
		if(getDelayLength() > 0 && useDefaultChecking())
		{
			delays.createNewDelay(getInternalName(), new StandardItemUpdater(getSpecialItemName(),specialItem.getType(),new Function<ItemStack,Boolean>(){
				@Override
				public Boolean apply(ItemStack stack)
				{
					return isSpecialItem(stack);
				}}));
		}
		onInitialize();
	}
	
	protected abstract void onInitialize();
	
	//getSpecialItem() has a guarantee that the special item name 
	//has a value
	protected abstract ItemStack specialItem();
	protected abstract String defaultSpecialItemName();
	protected abstract boolean isSpecialItem(ItemStack stack);
	protected abstract boolean performSpecialAction(Player player, AnniPlayer p);
	protected abstract long getDelayLength();
	protected abstract boolean useDefaultChecking();
	
	public ItemStack getSpecialItem()
	{
		return specialItem;
	}
	
	//This will be called before setUp
	@Override
	protected void loadKitStuff(ConfigurationSection section)
	{
		super.loadKitStuff(section);
		specialItemName = section.getString("SpecialItemName");
	}
	
	@Override
	protected int setDefaults(ConfigurationSection section)
	{
		//section.set("SpecialItemName", defaultSpecialItemName());
		return ConfigManager.setDefaultIfNotSet(section, "SpecialItemName", defaultSpecialItemName());
	}
	
	public String getSpecialItemName()
	{
		return specialItemName;
	}
	
//	public void giveSpecialItem(Player player)
//	{
//		if(player != null)
//			player.getInventory().addItem(specialItem.clone());
//	}
	
//	public ItemStack getSpecialItem()
//	{
//		return this.specialItem.clone();
//	}
	
	@EventHandler(priority = EventPriority.HIGHEST)
	public void specialItemActionCheck(final PlayerInteractEvent event)
	{
		if(useDefaultChecking())
		{
			if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)
			{
				if(event.getItem() != null && event.getItem().getType() == specialItem.getType())
				{
					AnniPlayer p = AnniPlayer.getPlayer(event.getPlayer().getUniqueId());
					if(p != null && p.getKit().equals(this) && isSpecialItem(event.getItem()))
					{
						event.setCancelled(true);
						if(!delays.hasActiveDelay(event.getPlayer(), getInternalName()))
						{
							//Do firestorm
							if(performSpecialAction(event.getPlayer(),p) && getDelayLength() > 0)
								delays.addDelay(event.getPlayer(), System.currentTimeMillis()+getDelayLength(), getInternalName());
						}
					}
				}
			}
		}
	}
	
}