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

using namespace rive;

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, Factory* factory)
{
    if (m_RenderPath != nullptr)
    {
        return m_RenderPath;
    }

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

    if (!m_TrimmedPath)
    {
        m_TrimmedPath = factory->makeEmptyRenderPath();
    }
    else
    {
        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.get());
                    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.get());
                while (endLength > pathLength)
                {
                    startLength = 0;
                    endLength -= pathLength;
                    path->trim(startLength, endLength, true, m_TrimmedPath.get());
                }
            }
        }
        break;
    }

    m_RenderPath = m_TrimmedPath.get();
    return m_RenderPath;
}

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

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