package gregtech.common.gui;


import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.enums.GT_Values;
import gregtech.common.items.GT_VolumetricFlask;
import gregtech.common.net.MessageSetFlaskCapacity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;

import java.text.DecimalFormat;
import java.text.ParseException;

@SideOnly(Side.CLIENT)
public final class GT_GUIContainerVolumetricFlask extends GuiContainer {
    private static final ResourceLocation BACKGROUND = new ResourceLocation("gregtech:textures/gui/VolumetricFlask.png");

    private GuiIntegerBox amount;
    private GuiButton apply;
    private GuiButton plus1;
    private GuiButton plus10;
    private GuiButton plus100;
    private GuiButton plus1000;
    private GuiButton minus1;
    private GuiButton minus10;
    private GuiButton minus100;
    private GuiButton minus1000;
    private GT_ContainerVolumetricFlask container;

    public GT_GUIContainerVolumetricFlask(GT_ContainerVolumetricFlask container) {
        super(container);
        this.container = container;
    }

    public void initGui() {
        super.initGui();

        buttonList.add(plus1 = new GuiButton(0, guiLeft + 20, guiTop + 26, 22, 20, "+1"));
        buttonList.add(plus10 = new GuiButton(0, guiLeft + 48, guiTop + 26, 28, 20, "+10"));
        buttonList.add(plus100 = new GuiButton(0, guiLeft + 82, guiTop + 26, 32, 20, "+100"));
        buttonList.add(plus1000 = new GuiButton(0, guiLeft + 120, guiTop + 26, 38, 20, "+1000"));

        buttonList.add(minus1 = new GuiButton(0, guiLeft + 20, guiTop + 75, 22, 20, "-1"));
        buttonList.add(minus10 = new GuiButton(0, guiLeft + 48, guiTop + 75, 28, 20, "-10"));
        buttonList.add(minus100 = new GuiButton(0, guiLeft + 82, guiTop + 75, 32, 20, "-100"));
        buttonList.add(minus1000 = new GuiButton(0, guiLeft + 120, guiTop + 75, 38, 20, "-1000"));

        buttonList.add(apply = new GuiButton(0, guiLeft + 128, guiTop + 51, 38, 20, "Accept"));

        amount = new GuiIntegerBox(fontRendererObj, guiLeft + 62, guiTop + 57, 59, fontRendererObj.FONT_HEIGHT, ((GT_VolumetricFlask) container.flask.getItem()).getMaxCapacity());
        amount.setEnableBackgroundDrawing(false);
        amount.setMaxStringLength(16);
        amount.setTextColor(16777215);
        amount.setVisible(true);
        amount.setFocused(true);
        amount.setText("1");
        System.out.println(((GT_VolumetricFlask) container.flask.getItem()).getCapacity(container.flask));
        amount.setText(String.valueOf(((GT_VolumetricFlask) container.flask.getItem()).getCapacity(container.flask)));
    }


    protected final void drawGuiContainerBackgroundLayer(float f, int x, int y) {
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        mc.getTextureManager().bindTexture(BACKGROUND);
        drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);

        try {
            Long.parseLong(amount.getText());
            apply.enabled = (amount.getText().length() > 0);
        } catch (NumberFormatException e) {
            apply.enabled = false;
        }

        amount.drawTextBox();
    }


    protected void keyTyped(char character, int key) {
        if (!checkHotbarKeys(key)) {
            if (key == 28)
                actionPerformed(apply);
            if (((key == 211) || (key == 205) || (key == 203) || (key == 14) || (character == '-') || (Character.isDigit(character))) && (amount.textboxKeyTyped(character, key))) {
                try {
                    String out = amount.getText();
                    boolean fixed = false;
                    while ((out.startsWith("0")) && (out.length() > 1)) {
                        out = out.substring(1);
                        fixed = true;
                    }
                    if (fixed) {
                        amount.setText(out);
                    }
                    if (out.isEmpty()) {
                        out = "0";
                    }
                    long result = Long.parseLong(out);
                    if (result < 0L) {
                        amount.setText("1");
                    }

                } catch (NumberFormatException ignored) {
                }
            } else {
                super.keyTyped(character, key);
            }
        }
    }

    protected void actionPerformed(GuiButton btn) {
        try {
            if (btn == apply) {
                GT_Values.NW.sendToServer(new MessageSetFlaskCapacity(Integer.parseInt(amount.getText()), Minecraft.getMinecraft().thePlayer));
                mc.thePlayer.closeScreen();
            }

        } catch (NumberFormatException e) {
            amount.setText("1");
        }

        boolean isPlus = (btn == plus1) || (btn == plus10) || (btn == plus100) || (btn == plus1000);
        boolean isMinus = (btn == minus1) || (btn == minus10) || (btn == minus100) || (btn == minus1000);

        if ((isPlus) || (isMinus)) {
            addQty(getQty(btn));
        }
    }

    private void addQty(int i) {
        try {
            String out = amount.getText();

            boolean fixed = false;
            while ((out.startsWith("0")) && (out.length() > 1)) {
                out = out.substring(1);
                fixed = true;
            }

            if (fixed) {
                amount.setText(out);
            }
            if (out.isEmpty()) {
                out = "0";
            }
            long result = Integer.parseInt(out);

            if ((result == 1L) && (i > 1)) {
                result = 0L;
            }
            result += i;
            if (result < 1L) {
                result = 1L;
            }
            out = Long.toString(result);
            Integer.parseInt(out);
            amount.setText(out);
        } catch (NumberFormatException ignored) {
        }
    }


    protected int getQty(GuiButton btn) {
        try {
            DecimalFormat df = new DecimalFormat("+#;-#");
            return df.parse(btn.displayString).intValue();
        } catch (ParseException ignored) {
        }

        return 0;
    }

    public class GuiIntegerBox extends GuiTextField {
        private final int maxValue;

        public GuiIntegerBox(FontRenderer fontRenderer, int x, int y, int width, int height) {
            this(fontRenderer, x, y, width, height, Integer.MAX_VALUE);
        }

        public GuiIntegerBox(FontRenderer fontRenderer, int x, int y, int width, int height, int maxValue) {
            super(fontRenderer, x, y, width, height);
            this.maxValue = maxValue;
        }


        public void writeText(String selectedText) {
            String original = getText();
            super.writeText(selectedText);

            try {
                int i = Integer.parseInt(getText());
                if (i > maxValue) {
                    setText(String.valueOf(maxValue));
                } else if (i < 0) {
                    setText("0");
                }
            } catch (NumberFormatException e) {
                setText(original);
            }
        }


        public void setText(String s) {
            try {
                int i = Integer.parseInt(s);
                if (i > maxValue) {
                    s = String.valueOf(maxValue);
                } else if (i < 0) {
                    s = "0";
                }
            } catch (NumberFormatException e) {
                s = String.valueOf(maxValue);
            }
            super.setText(s);
        }
    }

}