#ifndef _RIVE_CONTOUR_RENDER_PATH_HPP_
#define _RIVE_CONTOUR_RENDER_PATH_HPP_

#include "renderer.hpp"
#include "math/aabb.hpp"
#include <vector>
#include <cstdint>

namespace rive
{
	enum class PathCommandType : uint8_t
	{
		/// Corresponds to CommandPath::moveTo
		move,
		/// Corresponds to CommandPath::lineTo
		line,
		/// Corresponds to CommandPath::cubicTo
		cubic,
		/// Corresponds to CommandPath::close
		close
	};

	class PathCommand
	{
	private:
		PathCommandType m_Type;
		/// Only used when m_Type is cubic.
		Vec2D m_OutPoint;

		/// Only used when m_Type is cubic.
		Vec2D m_InPoint;

		/// Only used when m_Type is move or close or cubic.
		Vec2D m_Point;

	public:
		PathCommand(PathCommandType type);
		PathCommand(PathCommandType type, float x, float y);
		PathCommand(PathCommandType type,
		            float outX,
		            float outY,
		            float inX,
		            float inY,
		            float x,
		            float y);

		PathCommandType type() const { return m_Type; }
		const Vec2D& outPoint() const { return m_OutPoint; }
		const Vec2D& inPoint() const { return m_InPoint; }
		const Vec2D& point() const { return m_Point; }
	};
	///
	/// A reference to a sub-path added to a ContourRenderPath with its relative
	/// transform.
	///
	class ContourSubPath
	{
	private:
		RenderPath* m_Path;
		Mat2D m_Transform;

	public:
		ContourSubPath(RenderPath* path, const Mat2D& transform);

		RenderPath* path() const;
		const Mat2D& transform() const;
	};

	class ContourStroke;
	///
	/// Segments curves into line segments and computes the bounds of the
	/// segmented curve.
	///
	class ContourRenderPath : public RenderPath
	{
	protected:
		AABB m_ContourBounds;
		std::vector<Vec2D> m_ContourVertices;
		std::vector<ContourSubPath> m_SubPaths;
		std::vector<PathCommand> m_Commands;
		bool m_IsDirty = true;
		float m_ContourThreshold = 1.0f;
		bool m_IsClosed = false;

	public:
		std::size_t contourLength() const { return m_ContourVertices.size(); }
		const std::vector<Vec2D>& contourVertices() const
		{
			return m_ContourVertices;
		}
		bool isClosed() const { return m_IsClosed; }

		bool isContainer() const;
		void addRenderPath(RenderPath* path, const Mat2D& transform) override;

		void reset() override;
		void moveTo(float x, float y) override;
		void lineTo(float x, float y) override;
		void cubicTo(
		    float ox, float oy, float ix, float iy, float x, float y) override;
		void close() override;

		void computeContour();
		bool isDirty() const { return m_IsDirty; }

		void extrudeStroke(ContourStroke* stroke,
		                   StrokeJoin join,
		                   StrokeCap cap,
		                   float strokeWidth);
	};
} // namespace rive
#endif