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.skript.util.Direction;
import ch.njol.util.Kleenean;

import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCRegistry;

import org.bukkit.Location;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;

@Name("Respawn Citizen")
@Description({"Respawn citizens by:",
        "* ID",
        "* Direction",
        "* Location",
        "This will force an NPC to come back to life if it was previously killed or despawned by the " +
        "despawn citizen effect. This will not work if the citizen is already alive so it can't be used " +
        "to duplicate citizens"})
@RequiredPlugins("Citizens")
@Examples({"command /npcrespawn:",
        "\ttrigger:\n",
        "\t\trespawn citizen 0 at location of player"})
public class EffRespawnCitizen extends Effect {

    private Expression<Location> location;
    private Expression<Number> id;

    @SuppressWarnings("unchecked")
    @Override
    public boolean init(Expression<?>[] exprs, int arg1, Kleenean arg2, ParseResult arg3) {
        id = (Expression<Number>) exprs[0];
        location = Direction.combine((Expression<? extends Direction>) exprs[1],
                (Expression<? extends Location>) exprs[2]);
        return true;
    }

    @Override
    public String toString(@Nullable Event arg0, boolean arg1) {
        return "Spawning NPC: " + id.getSingle(arg0).intValue() + " At location " + location.toString();
    }

    @Override
    protected void execute(Event evt) {
        NPCRegistry registry = CitizensAPI.getNPCRegistry();
        NPC respawn = registry.getById(id.getSingle(evt).intValue());
        if (respawn.isSpawned()) {
            Skript.warning("This NPC is still alive!");
        } else {
            respawn.spawn(location.getSingle(evt));
        }
    }

}