#ifndef GAME_H
#define GAME_H

#include "LayeredFramebuffer.h"
#include "Texture3D.h"
#include "gaming-core/input/Buttons.h"
#include "gaming-core/math/Frustum.h"
#include "gaming-core/rendering/FileTexture.h"
#include "gaming-core/rendering/Shader.h"
#include "gaming-core/rendering/VertexBuffer.h"
#include "gaming-core/utils/Size.h"

class Game final {
    Shader& shader;
    Shader& noiceShader;
    LayeredFramebuffer& noiceBuffer;
    FileTexture bricks;
    FileTexture bricksBump;
    FileTexture bricksNormal;
    Buttons& buttons;
    const Size& size;
    VertexBuffer rectangleBuffer;
    VertexBuffer emptyBuffer;
    Frustum frustum;

    Button up;
    Button down;
    Button left;
    Button right;
    Button front;
    Button back;
    Button toggle;
    Button scaleUp;
    Button scaleDown;
    Button stepsUp;
    Button stepsDown;
    Button fineStepsUp;
    Button fineStepsDown;
    Button modeToggle;

    Vector3 oldPosition;
    Vector3 position;

    float oldHeight;
    float height;
    float heightScale;
    int steps;
    int fineSteps;
    bool mode;

public:
    Game(Shader& shader, Shader& noiceShader, LayeredFramebuffer& buffer,
         Buttons& buttons, const Size& size);

    void render(float lag);
    void tick();
    bool isRunning() const;
};

#endif