#include "rive/tess/segmented_contour.hpp"
#include "rive/math/raw_path.hpp"
#include "rive/math/cubic_utilities.hpp"

using namespace rive;

SegmentedContour::SegmentedContour(float threshold) :
    m_bounds(AABB::forExpansion()),
    m_threshold(threshold),
    m_thresholdSquared(threshold * threshold) {}

float SegmentedContour::threshold() const { return m_threshold; }
void SegmentedContour::threshold(float value) {
    m_threshold = value;
    m_thresholdSquared = value * value;
}
const AABB& SegmentedContour::bounds() const { return m_bounds; }
void SegmentedContour::addVertex(Vec2D vertex) {
    m_contourPoints.push_back(vertex);
    AABB::expandTo(m_bounds, vertex);
}

const std::size_t SegmentedContour::contourSize() const { return m_contourPoints.size(); }

const Span<const Vec2D> SegmentedContour::contourPoints(uint32_t endOffset) const {
    assert(endOffset <= m_contourPoints.size());
    return Span<const Vec2D>(m_contourPoints.data(), m_contourPoints.size() - endOffset);
}

void SegmentedContour::segmentCubic(const Vec2D& from,
                                    const Vec2D& fromOut,
                                    const Vec2D& toIn,
                                    const Vec2D& to,
                                    float t1,
                                    float t2) {
    if (CubicUtilities::shouldSplitCubic(from, fromOut, toIn, to, m_threshold)) {
        float halfT = (t1 + t2) / 2.0f;

        Vec2D hull[6];
        CubicUtilities::computeHull(from, fromOut, toIn, to, 0.5f, hull);

        segmentCubic(from, hull[0], hull[3], hull[5], t1, halfT);

        segmentCubic(hull[5], hull[4], hull[2], to, halfT, t2);
    } else {
        if (Vec2D::distanceSquared(from, to) > m_thresholdSquared) {
            addVertex(Vec2D(CubicUtilities::cubicAt(t2, from.x, fromOut.x, toIn.x, to.x),
                            CubicUtilities::cubicAt(t2, from.y, fromOut.y, toIn.y, to.y)));
        }
    }
}

void SegmentedContour::contour(const RawPath& rawPath, const Mat2D& transform) {
    m_contourPoints.clear();

    // Possible perf consideration: could add second path that doesn't transform
    // if transform is the identity.
    for (const auto [verb, pts] : rawPath) {
        switch (verb) {
            case PathVerb::move: addVertex(transform * pts[0]); break;
            case PathVerb::line: addVertex(transform * pts[1]); break;
            case PathVerb::cubic:
                segmentCubic(transform * pts[0],
                             transform * pts[1],
                             transform * pts[2],
                             transform * pts[3],
                             0.0f,
                             1.0f);
                break;
            case PathVerb::close: break;
            case PathVerb::quad:
                // TODO: not currently used by render paths, however might be
                // necessary for fonts.
                break;
        }
    }
}
