package de.ellpeck.actuallyadditions.mod.items;

import de.ellpeck.actuallyadditions.mod.config.ConfigValues;
import de.ellpeck.actuallyadditions.mod.items.base.ItemBase;
import de.ellpeck.actuallyadditions.mod.util.ModUtil;
import de.ellpeck.actuallyadditions.mod.util.StringUtil;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.MobSpawnerBaseLogic;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityMobSpawner;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.util.List;

public class ItemSpawnerChanger extends ItemBase{

    public ItemSpawnerChanger(String name){
        super(name);
        this.setMaxStackSize(1);
    }

    @Override
    public EnumActionResult onItemUse(ItemStack aStack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ){
        if(!world.isRemote){
            ItemStack stack = player.getHeldItemMainhand();
            if(player.canPlayerEdit(pos.offset(facing), facing, stack)){
                TileEntity tile = world.getTileEntity(pos);
                if(tile instanceof TileEntityMobSpawner){
                    String entity = this.getStoredEntity(stack);
                    if(entity != null){
                        MobSpawnerBaseLogic logic = ((TileEntityMobSpawner)tile).getSpawnerBaseLogic();
                        logic.setEntityName(entity);

                        tile.markDirty();

                        IBlockState state = world.getBlockState(pos);
                        world.notifyBlockUpdate(pos, state, state, 3);

                        ItemPhantomConnector.clearStorage(stack);

                        if(!player.capabilities.isCreativeMode){
                            stack.stackSize--;
                        }

                        return EnumActionResult.SUCCESS;
                    }
                }
            }
        }
        return EnumActionResult.FAIL;
    }

    @Override
    public boolean itemInteractionForEntity(ItemStack aStack, EntityPlayer player, EntityLivingBase entity, EnumHand hand){
        if(!player.worldObj.isRemote){
            ItemStack stack = player.getHeldItemMainhand();
            if(this.getStoredEntity(stack) == null){
                if(this.storeClickedEntity(stack, entity)){
                    entity.setDead();
                }
            }
            return true;
        }
        return false;
    }

    private boolean storeClickedEntity(ItemStack stack, EntityLivingBase entity){
        if(!stack.hasTagCompound()){
            stack.setTagCompound(new NBTTagCompound());
        }

        if(!(entity instanceof EntityPlayer)){
            String entityName = EntityList.getEntityString(entity);
            if(entityName != null && !entityName.isEmpty()){
                for(String name : ConfigValues.spawnerChangerBlacklist){
                    if(entityName.equals(name)){
                        return false;
                    }
                }

                stack.getTagCompound().setString("Entity", entityName);
                return true;
            }
        }
        return false;
    }

    private String getStoredEntity(ItemStack stack){
        if(stack.hasTagCompound()){
            String entity = stack.getTagCompound().getString("Entity");
            if(entity != null && !entity.isEmpty()){
                return entity;
            }
        }
        return null;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){
        String entity = this.getStoredEntity(stack);
        if(entity != null){
            list.add("Entity: "+entity);
            list.add(TextFormatting.ITALIC+StringUtil.localize("tooltip."+ModUtil.MOD_ID+".clearStorage.desc"));
        }
    }
}
