package me.zombie_striker.qg.miscitems;

import java.util.List;

import me.zombie_striker.customitemmanager.CustomBaseObject;
import me.zombie_striker.customitemmanager.CustomItemManager;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.GameMode;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;

import me.zombie_striker.customitemmanager.OLD_ItemFact;
import me.zombie_striker.qg.QAMain;
import me.zombie_striker.customitemmanager.MaterialStorage;
import me.zombie_striker.qg.guns.utils.WeaponSounds;
import me.zombie_striker.qg.handlers.ExplosionHandler;

public class Grenade extends CustomBaseObject implements ThrowableItems {

	private ItemStack[] ing = null;

	double dmageLevel = 10;
	double radius = 5;

	int craftingReturn;

	public Grenade(ItemStack[] ingg, double cost, double damage, double explosionreadius, String name,
			String displayname, List<String> lore, MaterialStorage ms) {
		super(name,ms,displayname,lore,false);
		super.setIngredients(ingg);
		this.setPrice(cost);
		this.radius = explosionreadius;
		this.dmageLevel = damage;
	}


	@Override
	public int getCraftingReturn() {
		return 1;
	}

	@SuppressWarnings("deprecation")
	@Override
	public boolean onRMB(Player thrower, ItemStack usedItem) {
		if (throwItems.containsKey(thrower)) {
			ThrowableHolder holder = throwItems.get(thrower);
			ItemStack grenadeStack = thrower.getItemInHand();
			ItemStack temp = grenadeStack.clone();
			temp.setAmount(1);
			if (thrower.getGameMode() != GameMode.CREATIVE) {
				if (grenadeStack.getAmount() > 1) {
					grenadeStack.setAmount(grenadeStack.getAmount() - 1);
				} else {
					grenadeStack = null;
				}
				thrower.setItemInHand(grenadeStack);
			}
			Item grenade = holder.getHolder().getWorld().dropItem(holder.getHolder().getLocation().add(0, 1.5, 0),
					temp);
			grenade.setPickupDelay(Integer.MAX_VALUE);
			grenade.setVelocity(thrower.getLocation().getDirection().normalize().multiply(1.2));
			holder.setHolder(grenade);
			thrower.getWorld().playSound(thrower.getLocation(), Sound.ENTITY_ARROW_SHOOT, 1, 1.5f);

			throwItems.put(grenade, holder);
			throwItems.remove(thrower);
			QAMain.DEBUG("Throw grenade");
		} else {
			thrower.sendMessage(QAMain.prefix + QAMain.S_GRENADE_PULLPIN);
		}
		return true;
	}

	@Override
	public boolean onLMB(Player e, ItemStack usedItem) {
		Player thrower = e.getPlayer();
		if (throwItems.containsKey(thrower)) {
			thrower.sendMessage(QAMain.prefix + QAMain.S_GRENADE_PALREADYPULLPIN);
			thrower.playSound(thrower.getLocation(), WeaponSounds.RELOAD_BULLET.getSoundName(), 1, 1);
			QAMain.DEBUG("Already pin out");
			return true;
		}

		thrower.getWorld().playSound(thrower.getLocation(), WeaponSounds.RELOAD_MAG_IN.getSoundName(), 2, 1);
		final ThrowableHolder h = new ThrowableHolder(thrower.getUniqueId(), thrower);
		h.setTimer(new BukkitRunnable() {
			@Override
			public void run() {
				if (h.getHolder() instanceof Player) {
					QAMain.DEBUG("Player did not throw. Damaged for " + dmageLevel);
					removeGrenade(((Player) h.getHolder()));
					((Player) h.getHolder()).damage(dmageLevel);
				}
				if (h.getHolder() instanceof Item) {
					h.getHolder().remove();
				}
				if (QAMain.enableExplosionDamage) {
					ExplosionHandler.handleExplosion(h.getHolder().getLocation(), 3, 1);
					QAMain.DEBUG("Using default explosions");
				}
				try {
					h.getHolder().getWorld().spawnParticle(org.bukkit.Particle.EXPLOSION_HUGE,
							h.getHolder().getLocation(), 0);
					h.getHolder().getWorld().playSound(h.getHolder().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 8,
							0.7f);
				} catch (Error e3) {
					h.getHolder().getWorld().playEffect(h.getHolder().getLocation(), Effect.valueOf("CLOUD"), 0);
					h.getHolder().getWorld().playSound(h.getHolder().getLocation(), Sound.valueOf("EXPLODE"), 8, 0.7f);
				}
				Player thro = Bukkit.getPlayer(h.getOwner());
				try {
					for (Entity e : h.getHolder().getNearbyEntities(radius, radius, radius)) {
						if (e instanceof LivingEntity) {
							double dam = (dmageLevel / e.getLocation().distance(h.getHolder().getLocation()));
							QAMain.DEBUG("Grenade-Damaging " + e.getName() + " : " + dam + " DAM.");
							if (thro == null)
								((LivingEntity) e).damage(dam);
							else
								((LivingEntity) e).damage(dam, thro);
						}
					}
				} catch (Error e) {
					h.getHolder().getWorld().createExplosion(h.getHolder().getLocation(), 1);
					QAMain.DEBUG("Failed. Created default explosion");
				}
				throwItems.remove(h.getHolder());
			}
		}.runTaskLater(QAMain.getInstance(), 5 * 20));
		throwItems.put(thrower, h);
		return true;
	}

	@Override
	public boolean is18Support() {
		return false;
	}

	@Override
	public void set18Supported(boolean b) {
	}

	@Override
	public ItemStack getItemStack() {
		return CustomItemManager.getItemType("gun").getItem(this.getItemData().getMat(),this.getItemData().getData(),this.getItemData().getVariant());
	}

	public void removeGrenade(Player player) {
		if (player.getGameMode() != GameMode.CREATIVE) {
			int slot = -56;
			ItemStack stack = null;
			for (int i = 0; i < player.getInventory().getContents().length; i++) {
				if ((stack = player.getInventory().getItem(i)) != null && MaterialStorage.getMS(stack) == getItemData()) {
					slot = i;
					break;
				}
			}
			if (slot >= -1) {
				if (stack.getAmount() > 1) {
					stack.setAmount(stack.getAmount() - 1);
				} else {
					stack = null;
				}
				player.getInventory().setItem(slot, stack);
			}
		}
	}
}