package makeo.gadomancy.common.items;

import makeo.gadomancy.common.Gadomancy;
import makeo.gadomancy.common.entities.EntityItemElement;
import makeo.gadomancy.common.registration.RegisteredItems;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.world.World;

import java.util.List;

/**
 * HellFirePvP@Admin
 * Date: 23.04.2016 / 01:52
 * on Gadomancy
 * ItemElementVoid
 */
public class ItemElement extends Item {

    public ItemElement() {
        setMaxStackSize(1);
        setHasSubtypes(true);
        setUnlocalizedName("ItemElement");
        setTextureName(Gadomancy.MODID + ":element");
        setCreativeTab(RegisteredItems.creativeTab);
    }

    @Override
    public String getUnlocalizedName(ItemStack stack) {
        return getUnlocalizedName() + "." + stack.getItemDamage();
    }

    @Override
    public int getMetadata(int metadata) {
        return metadata;
    }

    @Override
    public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHolding) {
        if(stack == null || !(stack.getItem() instanceof ItemElement)) return;
        int meta = stack.getItemDamage();
        ItemElement.EnumElementType element = ItemElement.EnumElementType.values()[meta % ItemElement.EnumElementType.values().length];

        if(!world.isRemote) {
            if((world.getTotalWorldTime() & 15) == 0) {
                EntityItemElement.doElementServerEffects(element, world, entity.posX, entity.posY, entity.posZ);
            }
        }
    }

    @Override
    public void getSubItems(Item item, CreativeTabs tabs, List list) {
        for (EnumElementType type : EnumElementType.values()) {
            list.add(new ItemStack(this, 1, type.ordinal()));
        }
    }

    @Override
    public EnumRarity getRarity(ItemStack p_77613_1_) {
        return EnumRarity.epic;
    }

    @Override
    public int getColorFromItemStack(ItemStack stack, int pass) {
        int dmg = stack.getItemDamage();
        if(dmg < EnumElementType.values().length) {
            return EnumElementType.values()[dmg].getRenderColor();
        }
        return 0xFFFFFF;
    }

    public static abstract class ElementRunnable {

        public abstract void affectEntity(EntityLivingBase livingBase);

    }

    public static enum EnumElementType {

        DARKNESS(0x000000, new ElementRunnable() {
            @Override
            public void affectEntity(EntityLivingBase livingBase) {
                livingBase.addPotionEffect(new PotionEffect(Potion.blindness.getId(), 100, 0, true));
            }
        });
        /*ORDER(0xFFFFFF, new ElementRunnable() {
            @Override
            public void affectEntity(EntityLivingBase livingBase) {
                livingBase.addPotionEffect(new PotionEffect(Potion.nightVision.getId(), 300, 0, true));
            }
        }),
        FIRE(0x970000, new ElementRunnable() {
            @Override
            public void affectEntity(EntityLivingBase livingBase) {
                livingBase.setFire(10);
            }
        });*/

        private final int renderColor;
        private final ElementRunnable runnable;

        private EnumElementType(int color, ElementRunnable runnable) {
            this.renderColor = color;
            this.runnable = runnable;
        }

        public ElementRunnable getRunnable() {
            return runnable;
        }

        public int getRenderColor() {
            return renderColor;
        }
    }

}