#pragma once

#include <GL/gl3w.h>
#include <string>
#include <vector>
#include <glm/glm.hpp>

#include "Shader.hpp"

namespace render {
    struct passOptions;
}
namespace render::gl {
    class Renderer;
}
namespace pass {
    /// OpenGL shaders pipeline
    class Program {
    public:
        virtual ~Program();

        /// Bind program
        void useIt();

    protected:
        /// Get shaders name prefix
        virtual std::string getName() const = 0;

        Shader *loadShader(GLenum type, const std::vector<std::string> &flags = {});
        void load(const std::vector<Shader *> &shaders);

        GLuint ProgramID;
    };
}
