package nz.co.jammehcow.lukkit.environment.wrappers;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.OneArgFunction;
import org.luaj.vm2.lib.ZeroArgFunction;
import org.luaj.vm2.lib.jse.CoerceJavaToLua;

/**
 * @author jammehcow
 */

public class SkullWrapper extends LuaTable {
    private ItemStack skull;
    private SkullMeta meta;
    private SkullWrapper self;

    public SkullWrapper(ItemStack skullItem) {
        this.skull = (skullItem == null) ? new ItemStack(Material.SKULL_ITEM, 1) : skull;
        this.self = this; // Allows access from setOwner() since this is populate by the function.

        if (skullItem == null) {
            this.skull.setDurability((short) 3);
            this.meta = (SkullMeta) Bukkit.getItemFactory().getItemMeta(Material.SKULL_ITEM);
        } else {
            this.meta = (SkullMeta) this.skull.getItemMeta();
        }

        this.set("setOwner", new OneArgFunction() {
            @Override
            public LuaValue call(LuaValue username) {
                meta.setOwner(username.checkjstring());
                return CoerceJavaToLua.coerce(self);
            }
        });

        this.set("hasOwner", new ZeroArgFunction() {
            @Override
            public LuaValue call() {
                return LuaValue.valueOf(meta.hasOwner());
            }
        });

        this.set("getOwner", new ZeroArgFunction() {
            @Override
            public LuaValue call() {
                if (meta.getOwner() == null) {
                    return LuaValue.NIL;
                }
                return LuaValue.valueOf(meta.getOwner());
            }
        });

        this.set("getItemStack", new ZeroArgFunction() {
            @Override
            public LuaValue call() {
                skull.setItemMeta(meta);
                return CoerceJavaToLua.coerce(skull);
            }
        });
    }
}