#ifndef _RIVE_NOOP_RENDERER_HPP_
#define _RIVE_NOOP_RENDERER_HPP_
#include <rive/renderer.hpp>
#include <vector>

namespace rive
{
	class NoOpRenderPaint : public RenderPaint
	{
	public:
		void color(unsigned int value) override {}
		void style(RenderPaintStyle value) override {}
		void thickness(float value) override {}
		void join(StrokeJoin value) override {}
		void cap(StrokeCap value) override {}
		void blendMode(BlendMode value) override {}

		void linearGradient(float sx, float sy, float ex, float ey) override {}
		void radialGradient(float sx, float sy, float ex, float ey) override {}
		void addStop(unsigned int color, float stop) override {}
		void completeGradient() override {}
		void invalidateStroke() override {}
	};

	enum class NoOpPathCommandType
	{
		MoveTo,
		LineTo,
		CubicTo,
		Reset,
		Close
	};

	struct NoOpPathCommand
	{
		NoOpPathCommandType command;
		float x;
		float y;
		float inX;
		float inY;
		float outX;
		float outY;
	};

	class NoOpRenderPath : public RenderPath
	{
	public:
		std::vector<NoOpPathCommand> commands;
		void reset() override
		{
			commands.emplace_back((NoOpPathCommand){NoOpPathCommandType::Reset,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f});
		}

		void fillRule(FillRule value) override {}
		void addPath(CommandPath* path, const Mat2D& transform) override {}
		void addRenderPath(RenderPath* path, const Mat2D& transform) override {}

		void moveTo(float x, float y) override
		{
			commands.emplace_back((NoOpPathCommand){
			    NoOpPathCommandType::MoveTo, x, y, 0.0f, 0.0f, 0.0f, 0.0f});
		}
		void lineTo(float x, float y) override
		{
			commands.emplace_back((NoOpPathCommand){
			    NoOpPathCommandType::LineTo, x, y, 0.0f, 0.0f, 0.0f, 0.0f});
		}
		void cubicTo(
		    float ox, float oy, float ix, float iy, float x, float y) override
		{
			commands.emplace_back((NoOpPathCommand){
			    NoOpPathCommandType::CubicTo, x, y, ix, iy, ox, oy});
		}
		void close() override
		{
			commands.emplace_back((NoOpPathCommand){NoOpPathCommandType::Close,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f,
			                                        0.0f});
		}
	};

	class NoOpRenderer : public Renderer
	{
		void save() {}
		void restore() {}
		void transform(const Mat2D& transform) {}
		void translate(float x, float y) {}
		void drawPath(RenderPath* path, RenderPaint* paint) {}
		void clipPath(RenderPath* path) {}
	};

} // namespace rive
#endif