#include <myEngine/model.hpp>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

class Object {
public:
    Model& model;
    glm::vec3 position;
    glm::vec3 scale;
    glm::vec3 rotation;
    glm::vec3 acceleration;

    Object(Model &model, glm::vec3 position, glm::vec3 scale, glm::vec3 rotation) : model(model), position(position), scale(scale), rotation(rotation) {}

    glm::mat4 getModelMatrix() const {
        glm::mat4 model = glm::mat4(1.0f);
        model = glm::translate(model, position);
        model = glm::scale(model, scale);
        model = glm::rotate(model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f));
        model = glm::rotate(model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f));
        model = glm::rotate(model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
        return model;
    }

    void setPosition(const glm::vec3 &newPosition) {
        position = newPosition;
    }

    void setScale(const glm::vec3 &newScale) {
        scale = newScale;
    }

    void setRotation(const glm::vec3 &newRotation) {
        rotation = newRotation;
    }

    void setAcceleration(const glm::vec3 &newAcceleration) {
        acceleration = newAcceleration;
    }

    void Draw(Shader &shader, float deltaTime) {
        position += acceleration * deltaTime;
        acceleration = glm::vec3(0.0f, 0.0f, 0.0f);

        glm::mat4 modelMatrix = getModelMatrix();
        shader.setMat4("model", modelMatrix);
        model.Draw(shader);
    }
};