package pneumaticCraft.common.item;

import java.util.List;

import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import pneumaticCraft.client.gui.GuiGPSTool;
import pneumaticCraft.common.NBTUtil;
import pneumaticCraft.common.remote.GlobalVariableManager;
import pneumaticCraft.lib.Textures;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ItemGPSTool extends ItemPneumatic{
    public ItemGPSTool(){
        setMaxStackSize(1);
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void registerIcons(IIconRegister par1IconRegister){
        itemIcon = par1IconRegister.registerIcon(Textures.ITEM_GPS_TOOL);
    }

    @Override
    public boolean onItemUse(ItemStack IStack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10){
        setGPSLocation(IStack, x, y, z);
        if(!world.isRemote) player.addChatComponentMessage(new ChatComponentTranslation(EnumChatFormatting.GREEN + "[GPS Tool] Set Coordinates to " + x + ", " + y + ", " + z + "."));
        return true; // we don't want to use the item.

    }

    /**
     * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
     */
    @Override
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){
        if(world.isRemote) {
            ChunkPosition pos = getGPSLocation(stack);
            FMLCommonHandler.instance().showGuiScreen(new GuiGPSTool(pos != null ? pos : new ChunkPosition(0, 0, 0), getVariable(stack)));
        }
        return stack;
    }

    // the information displayed as tooltip info. (saved coordinates in this
    // case)
    @Override
    public void addInformation(ItemStack stack, EntityPlayer player, List infoList, boolean par4){
        super.addInformation(stack, player, infoList, par4);
        NBTTagCompound compound = stack.stackTagCompound;
        if(compound != null) {
            int x = compound.getInteger("x");
            int y = compound.getInteger("y");
            int z = compound.getInteger("z");
            if(x != 0 || y != 0 || z != 0) {
                infoList.add("\u00a72Set to " + x + ", " + y + ", " + z);
            }
            String varName = getVariable(stack);
            if(!varName.equals("")) {
                infoList.add(I18n.format("gui.tooltip.gpsTool.variable", varName));
            }
        }
    }

    @Override
    public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean heldItem){
        String var = getVariable(stack);
        if(!var.equals("") && !world.isRemote) {
            ChunkPosition pos = GlobalVariableManager.getInstance().getPos(var);
            setGPSLocation(stack, pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ);
        }
    }

    public static ChunkPosition getGPSLocation(ItemStack gpsTool){
        NBTTagCompound compound = gpsTool.stackTagCompound;
        if(compound != null) {
            String var = getVariable(gpsTool);
            if(!var.equals("") && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
                ChunkPosition pos = GlobalVariableManager.getInstance().getPos(var);
                setGPSLocation(gpsTool, pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ);
            }
            int x = compound.getInteger("x");
            int y = compound.getInteger("y");
            int z = compound.getInteger("z");
            if(x != 0 || y != 0 || z != 0) {
                return new ChunkPosition(x, y, z);
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    public static void setGPSLocation(ItemStack gpsTool, int x, int y, int z){
        NBTUtil.setInteger(gpsTool, "x", x);
        NBTUtil.setInteger(gpsTool, "y", y);
        NBTUtil.setInteger(gpsTool, "z", z);
        String var = getVariable(gpsTool);
        if(!var.equals("")) GlobalVariableManager.getInstance().set(var, x, y, z);
    }

    public static void setVariable(ItemStack gpsTool, String variable){
        NBTUtil.setString(gpsTool, "variable", variable);
    }

    public static String getVariable(ItemStack gpsTool){
        return gpsTool.hasTagCompound() ? gpsTool.getTagCompound().getString("variable") : "";
    }
}