package codes.biscuit.skyblockaddons.gui.buttons;

import codes.biscuit.skyblockaddons.utils.UpdateCallback;
import codes.biscuit.skyblockaddons.utils.nifty.ChatFormatting;
import codes.biscuit.skyblockaddons.utils.nifty.StringUtil;
import codes.biscuit.skyblockaddons.utils.nifty.reflection.MinecraftReflection;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;

import java.util.List;

public class ButtonInputFieldWrapper extends GuiButton {

    private GuiTextField textField;
    private String placeholderText;
    private UpdateCallback<String> textUpdated;

    public ButtonInputFieldWrapper(int x, int y, int w, int h, String buttonText, int maxLength, boolean focused, UpdateCallback<String> textUpdated) {
        this(x, y, w, h, buttonText, null, maxLength, focused, textUpdated);
    }

    public ButtonInputFieldWrapper(int x, int y, int w, int h, String buttonText, String placeholderText, int maxLength, boolean focused, UpdateCallback<String> textUpdated) {
        super(-1, x, y, buttonText);
        this.placeholderText = placeholderText;
        this.textUpdated = textUpdated;

        textField = new GuiTextField(-1, Minecraft.getMinecraft().fontRendererObj, x, y, w, h);
        textField.setMaxStringLength(maxLength);
        textField.setFocused(focused);
        textField.setText(buttonText);
    }

    @Override
    public void drawButton(Minecraft mc, int mouseX, int mouseY) {
        textField.drawTextBox();
        if (placeholderText != null && StringUtil.isEmpty(textField.getText())) {
            MinecraftReflection.FontRenderer.drawString(placeholderText, xPosition+4, yPosition+3, ChatFormatting.DARK_GRAY);
        }
    }

    protected void keyTyped(char typedChar, int keyCode) {
        if (textField.isFocused()) {
            textField.textboxKeyTyped(typedChar, keyCode);
        }
        textUpdated.onUpdate(textField.getText());
    }

    @Override
    public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) {
        textField.mouseClicked(mouseX, mouseY, 0);

        return textField.isFocused();
    }

    public void updateScreen() {
        textField.updateCursorCounter();
    }

    public static void callKeyTyped(List<GuiButton> buttonList, char typedChar, int keyCode) {
        for (GuiButton button : buttonList) {
            if (button instanceof ButtonInputFieldWrapper) {
                ((ButtonInputFieldWrapper)button).keyTyped(typedChar, keyCode);
            }
        }
    }

    public static void callUpdateScreen(List<GuiButton> buttonList) {
        for (GuiButton button : buttonList) {
            if (button instanceof ButtonInputFieldWrapper) {
                ((ButtonInputFieldWrapper)button).updateScreen();
            }
        }
    }
}