package pneumaticCraft.common.remote;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;

import org.apache.commons.lang3.text.WordUtils;

import pneumaticCraft.client.gui.GuiRemoteEditor;
import pneumaticCraft.client.gui.remote.GuiRemoteDropdown;
import pneumaticCraft.client.gui.widget.WidgetComboBox;
import pneumaticCraft.common.network.NetworkHandler;
import pneumaticCraft.common.network.PacketSetGlobalVariable;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ActionWidgetDropdown extends ActionWidgetVariable<WidgetComboBox>{

    private int x, y, width, height;
    private String dropDownElements = "";
    private String selectedElement = "";

    public ActionWidgetDropdown(){
        super();
    }

    public ActionWidgetDropdown(WidgetComboBox widget){
        super(widget);
        width = widget.width;
        height = widget.height;
        widget.setText(I18n.format("remote.dropdown.name"));
        widget.setTooltip(WordUtils.wrap(I18n.format("remote.dropdown.tooltip"), 50).split(System.getProperty("line.separator")));
    }

    @Override
    public void readFromNBT(NBTTagCompound tag, int guiLeft, int guiTop){
        super.readFromNBT(tag, guiLeft, guiTop);
        x = tag.getInteger("x") + guiLeft;
        y = tag.getInteger("y") + guiTop;
        width = tag.getInteger("width");
        height = tag.getInteger("height");
        dropDownElements = tag.getString("dropDownElements");
        updateWidget();
    }

    @Override
    public NBTTagCompound toNBT(int guiLeft, int guiTop){
        NBTTagCompound tag = super.toNBT(guiLeft, guiTop);
        tag.setInteger("x", x - guiLeft);
        tag.setInteger("y", y - guiTop);
        tag.setInteger("width", width);
        tag.setInteger("height", height);
        tag.setString("dropDownElements", dropDownElements);

        return tag;
    }

    @Override
    public String getId(){
        return "dropdown";
    }

    @Override
    public void onKeyTyped(){
        String[] elements = getDropdownElements();
        selectedElement = getWidget().getText();
        for(int i = 0; i < elements.length; i++) {
            if(elements[i].equals(selectedElement)) {
                NetworkHandler.sendToServer(new PacketSetGlobalVariable(getVariableName(), i));
                break;
            }
        }
    }

    @Override
    public void onVariableChange(){
        updateWidget();
    }

    @Override
    public void setWidgetPos(int x, int y){
        this.x = x;
        this.y = y;
        updateWidget();
    }

    @Override
    public WidgetComboBox getWidget(){
        if(widget == null) {
            widget = new WidgetComboBox(Minecraft.getMinecraft().fontRenderer, x, y, width, height);
            widget.setElements(getDropdownElements());
            widget.setFixedOptions();
            updateWidget();
        }
        return widget;
    }

    private String[] getDropdownElements(){
        return dropDownElements.split(",");
    }

    private void updateWidget(){
        String[] elements = getDropdownElements();
        selectedElement = elements[MathHelper.clamp_int(GlobalVariableManager.getInstance().getInteger(getVariableName()), 0, elements.length - 1)];

        if(widget != null) {
            widget.xPosition = x;
            widget.yPosition = y;
            widget.width = width;
            widget.height = height;
            widget.setElements(getDropdownElements());
            widget.setText(selectedElement);
        }
    }

    @Override
    public void onActionPerformed(){}

    public void setDropDownElements(String dropDownElements){
        this.dropDownElements = dropDownElements;
        updateWidget();
    }

    public String getDropDownElements(){
        return dropDownElements;
    }

    public void setWidth(int width){
        this.width = width;
        updateWidget();
    }

    public int getWidth(){
        return width;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public GuiScreen getGui(GuiRemoteEditor guiRemote){
        return new GuiRemoteDropdown(this, guiRemote);
    }
}