#include "rive/shapes/paint/trim_path.hpp"
#include "rive/shapes/metrics_path.hpp"
#include "rive/shapes/paint/stroke.hpp"

using namespace rive;

TrimPath::TrimPath() : m_TrimmedPath(makeRenderPath()) {}
TrimPath::~TrimPath() { delete m_TrimmedPath; }

StatusCode TrimPath::onAddedClean(CoreContext* context)
{
	if (!parent()->is<Stroke>())
	{
		return StatusCode::InvalidObject;
	}

	parent()->as<Stroke>()->addStrokeEffect(this);

	return StatusCode::Ok;
}

RenderPath* TrimPath::effectPath(MetricsPath* source)
{
	if (m_RenderPath != nullptr)
	{
		return m_RenderPath;
	}

	// Source is always a containing (shape) path.
	const std::vector<MetricsPath*>& subPaths = source->paths();

	m_TrimmedPath->reset();
	auto renderOffset = std::fmod(std::fmod(offset(), 1.0f) + 1.0f, 1.0f);
	switch (modeValue())
	{
		case 1:
		{
			float totalLength = source->length();
			auto startLength = totalLength * (start() + renderOffset);
			auto endLength = totalLength * (end() + renderOffset);

			if (endLength < startLength)
			{
				float swap = startLength;
				startLength = endLength;
				endLength = swap;
			}

			if (startLength > totalLength)
			{
				startLength -= totalLength;
				endLength -= totalLength;
			}

			int i = 0, subPathCount = (int)subPaths.size();
			while (endLength > 0)
			{
				auto path = subPaths[i % subPathCount];
				auto pathLength = path->length();

				if (startLength < pathLength)
				{
					path->trim(startLength, endLength, true, m_TrimmedPath);
					endLength -= pathLength;
					startLength = 0;
				}
				else
				{
					startLength -= pathLength;
					endLength -= pathLength;
				}
				i++;
			}
		}
		break;

		case 2:
		{
			for (auto path : subPaths)
			{
				auto pathLength = path->length();
				auto startLength = pathLength * (start() + renderOffset);
				auto endLength = pathLength * (end() + renderOffset);
				if (endLength < startLength)
				{
					auto length = startLength;
					startLength = endLength;
					endLength = length;
				}

				if (startLength > pathLength)
				{
					startLength -= pathLength;
					endLength -= pathLength;
				}
				path->trim(startLength, endLength, true, m_TrimmedPath);
				while (endLength > pathLength)
				{
					startLength = 0;
					endLength -= pathLength;
					path->trim(startLength, endLength, true, m_TrimmedPath);
				}
			}
		}
		break;
	}

	m_RenderPath = m_TrimmedPath;
	return m_RenderPath;
}

void TrimPath::invalidateEffect()
{
	m_RenderPath = nullptr;
	parent()->as<Stroke>()->parent()->addDirt(ComponentDirt::Paint);
}

void TrimPath::startChanged() { invalidateEffect(); }
void TrimPath::endChanged() { invalidateEffect(); }
void TrimPath::offsetChanged() { invalidateEffect(); }
void TrimPath::modeValueChanged() { invalidateEffect(); }
