#ifndef VERTEXBUFFER_H
#define VERTEXBUFFER_H

#include <GL/glew.h>

#include "wrapper/Attributes.h"

class VertexBuffer final {
    GLuint vertexArray;
    GLuint vertexBuffer;

public:
    VertexBuffer();
    ~VertexBuffer();
    VertexBuffer(const VertexBuffer& other) = delete;
    VertexBuffer(VertexBuffer&& other) = delete;
    VertexBuffer& operator=(const VertexBuffer& other) = delete;
    VertexBuffer& operator=(VertexBuffer&& other) = delete;

    void setAttributes(const Attributes& attributes);
    void setStaticData(int size, const void* data = nullptr);
    void setStreamData(int size, const void* data = nullptr);
    void setDynamicData(int size, const void* data = nullptr);
    void updateData(int offset, int size, const void* data);

    void draw(int vertices, int offset = 0);
    void drawStrip(int vertices, int offset = 0);

private:
    void draw(int vertices, int mode, int offset = 0);
    void setData(int size, const void* data, int flag);
    void bindArray() const;
    void bindBuffer() const;
};

#endif