package de.epiceric.shopchest.nms;	
	
import java.lang.reflect.InvocationTargetException;

import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;

import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.utils.Utils;
	
public class SpawnEggMeta {	
	
    private static String getNBTEntityID(ShopChest plugin, ItemStack stack) {	
        try {	
            Class<?> craftItemStackClass = Utils.getCraftClass("inventory.CraftItemStack");	
	
            if (craftItemStackClass == null) {	
                plugin.debug("Failed to get NBTEntityID: Could not find CraftItemStack class");	
                return null;	
            }	
	
            Object nmsStack = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, stack);	
	
            Object nbtTagCompound = nmsStack.getClass().getMethod("getTag").invoke(nmsStack);	
            if (nbtTagCompound == null) return null;	
	
            Object entityTagCompound = nbtTagCompound.getClass().getMethod("getCompound", String.class).invoke(nbtTagCompound, "EntityTag");	
            if (entityTagCompound == null) return null;	
	
            Object id = entityTagCompound.getClass().getMethod("getString", String.class).invoke(entityTagCompound, "id");	
            if (id instanceof String) return (String) id;	
	
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {	
            plugin.getLogger().severe("Failed to get NBTEntityID with reflection");	
            plugin.debug("Failed to get NBTEntityID with reflection");	
            plugin.debug(e);	
        }	
	
        return null;	
    }	
	
    /**	
     * @param plugin An instance of the {@link ShopChest} plugin
     * @param stack {@link ItemStack} (Spawn Egg) of which the Entity should be gotten	
     * @return The {@link EntityType} the Spawn Egg will spawn or <b>null</b> if <i>nbtEntityID</i> is null	
     */	
    public static EntityType getEntityTypeFromItemStack(ShopChest plugin, ItemStack stack) {	
        if (Utils.getMajorVersion() == 8) {	
            EntityType type = null;	
	
            for (EntityType entityType : EntityType.values()) {	
                if (entityType.getTypeId() == stack.getDurability()) {	
                    type = entityType;	
                    break;	
                }	
            }	
	
            return type;	
        }	
	
        String nbtEntityID = getNBTEntityID(plugin, stack);	
	
        if (nbtEntityID == null) return null;	
	
        if (Utils.getMajorVersion() >= 11) {	
            if (nbtEntityID.contains(":")) nbtEntityID = nbtEntityID.split(":")[1];	
            return EntityType.fromName(nbtEntityID);	
        }	
	
        switch (nbtEntityID) {	
            case "PigZombie":	
                return EntityType.valueOf("PIG_ZOMBIE");	
            case "CaveSpider":	
                return EntityType.CAVE_SPIDER;	
            case "LavaSlime":	
                return EntityType.MAGMA_CUBE;	
            case "MushroomCow":	
                return EntityType.MUSHROOM_COW;	
            case "EntityHorse":	
                return EntityType.HORSE;	
            case "PolarBear":	
                return EntityType.POLAR_BEAR;	
            case "Ozelot":	
                return EntityType.OCELOT;	
            default:	
                return EntityType.valueOf(nbtEntityID.toUpperCase());	
	
        }	
    }	
	
}