package net.rayfall.eyesniper2.skrayfall.citizens.effects;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.RequiredPlugins;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean;

import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCRegistry;
import net.citizensnpcs.api.trait.trait.Equipment;
import net.citizensnpcs.api.trait.trait.Equipment.EquipmentSlot;

import org.bukkit.entity.EntityType;
import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
import org.eclipse.jdt.annotation.Nullable;

@Name("Citizen Hold")
@Description("This will make a Citizen hold an object in their hand.")
@RequiredPlugins("Citizens")
@Examples({"command /npcholdsword:",
        "\ttrigger:",
        "\t\tmake citizen last created citizen id hold iron sword"})
public class EffCitizenHold extends Effect {

    // make citizen %number% hold %itemstack%

    private Expression<Number> id;
    private Expression<ItemStack> item;

    @SuppressWarnings("unchecked")
    @Override
    public boolean init(Expression<?>[] exp, int arg1, Kleenean arg2, ParseResult arg3) {
        id = (Expression<Number>) exp[0];
        item = (Expression<ItemStack>) exp[1];
        return true;
    }

    @Override
    public String toString(@Nullable Event arg0, boolean arg1) {
        return null;
    }

    @Override
    protected void execute(Event evt) {
        NPCRegistry registry = CitizensAPI.getNPCRegistry();
        NPC getter = registry.getById(id.getSingle(evt).intValue());
        if (getter.getEntity().getType().equals(EntityType.PLAYER)
                || getter.getEntity().getType() == EntityType.ENDERMAN
                || getter.getEntity().getType() == EntityType.ZOMBIE
                || getter.getEntity().getType() == EntityType.SKELETON) {
            Equipment equ = getter.getTrait(Equipment.class);
            equ.set(EquipmentSlot.HAND, item.getSingle(evt));
        } else {
            Skript.error("Entity must be equipable!");
        }

    }

}