#ifndef _RIVE_OPENGL_RENDERER_HPP_
#define _RIVE_OPENGL_RENDERER_HPP_

#include "rive/math/mat2d.hpp"
#include "low_level/low_level_renderer.hpp"
#include "opengl.h"
#include <vector>

namespace rive
{
	class OpenGLRenderer : public LowLevelRenderer
	{
	private:
		Mat2D m_Projection;
		GLuint m_VertexShader = 0, m_FragmentShader = 0;
		GLuint m_Program = 0;
		GLuint m_IndexBuffer = 0;
		GLint m_ProjectionUniformIndex = -1;
		GLint m_TransformUniformIndex = -1;
		GLint m_FillTypeUniformIndex = -1;
		GLint m_StopCountUniformIndex = -1;
		GLint m_StopColorsUniformIndex = -1;
		GLint m_ColorUniformIndex = -1;
		GLint m_StopsUniformIndex = -1;
		GLint m_GradientPositionUniformIndex = -1;
		GLint m_ShapeTransformUniformIndex = -1;
		GLuint m_VertexArray = 0;
		GLuint m_BlitBuffer = 0;
		bool m_IsClipping = false;

		/// Indices for the max sized contour, prepended with 2 triangles for
		/// bounding boxes.
		std::vector<unsigned short> m_Indices;

	public:
		const GLuint indexBuffer() const { return m_IndexBuffer; }
		GraphicsApi::Type type() const override { return GraphicsApi::opengl; }
		OpenGLRenderer();
		~OpenGLRenderer();
		void drawPath(RenderPath* path, RenderPaint* paint) override;

		void startFrame() override;
		void endFrame() override;

		RenderPaint* makeRenderPaint() override;
		RenderPath* makeRenderPath() override;

		bool initialize(void* data) override;

		void updateIndexBuffer(std::size_t contourLength);

		GLint transformUniformIndex() const { return m_TransformUniformIndex; }

		GLint fillTypeUniformIndex() const { return m_FillTypeUniformIndex; }
		GLint stopCountUniformIndex() const { return m_StopCountUniformIndex; }
		GLint stopColorsUniformIndex() const
		{
			return m_StopColorsUniformIndex;
		}
		GLint colorUniformIndex() const { return m_ColorUniformIndex; }
		GLint stopsUniformIndex() const { return m_StopsUniformIndex; }
		GLint shapeTransformUniformIndex() const
		{
			return m_ShapeTransformUniformIndex;
		}
		GLint gradientPositionUniformIndex() const
		{
			return m_GradientPositionUniformIndex;
		}

		GLuint program() const { return m_Program; }
		virtual const char* shaderHeader() const { return nullptr; };
	};

} // namespace rive
#endif