#ifndef BASE_GUI_H
#define BASE_GUI_H

#include "client/input/Controller.h"
#include "client/rendering/Renderer.h"
#include "client/rendering/ShaderMatrix.h"
#include "input/TextInput.h"
#include "math/Vector.h"
#include "utils/List.h"
#include "utils/Size.h"

struct BaseGUI final {
    static const Vector2 FIXED_SIZE;

    const Size& size;
    TextInput*& textInput;
    const Controller& controller;

    float scale;
    Vector2 scaledSize;

    struct Base {
        Vector2 pos;
        Vector2 size;
        bool hovered;
        bool pressed;
        Base();
    };

    struct Label {
        Base base;
        StringBuffer<50> text;
    };
    List<Label> labels;

    struct Input {
        Base base;
        TextInput text;
    };
    List<Input> inputs;

    struct Button {
        Base base;
        StringBuffer<20> text;
    };
    List<Button> buttons;

    BaseGUI(const Size& size, TextInput*& textInput,
            const Controller& controller);

    void tick();
    void updateScale(ShaderMatrix& sm);
    void render(float lag, ShaderMatrix& sm, Renderer& r);
    Vector2 round(const Vector2& v) const;
    void renderString(Renderer& r, const Vector2& pos, const char* s);
    Label& addLabel(const char* text);
    Input& addInput();
    Button& addButton(const char* text);
    bool isIn(const Vector2& pos, const Vector2& size,
              const Vector2& point) const;

private:
    void tickBase(Base& b);
    Vector2 renderCenteredString(Renderer& r, const Base& b, const char* text);
    void renderBase(Renderer& r, const Base& b);
    void renderLabels(Renderer& r);
    void renderInputs(Renderer& r);
    void renderButtons(Renderer& r);
};

#endif