#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;
	};

	///
	/// 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;

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

		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; }
	};
} // namespace rive
#endif