#include "rive/shapes/paint/stroke.hpp"
#include "rive/shapes/paint/stroke_cap.hpp"
#include "rive/shapes/paint/stroke_effect.hpp"
#include "rive/shapes/paint/stroke_join.hpp"

using namespace rive;

PathSpace Stroke::pathSpace() const {
    return transformAffectsStroke() ? PathSpace::Local : PathSpace::World;
}

RenderPaint* Stroke::initRenderPaint(ShapePaintMutator* mutator) {
    auto renderPaint = Super::initRenderPaint(mutator);
    renderPaint->style(RenderPaintStyle::stroke);
    renderPaint->thickness(thickness());
    renderPaint->cap((StrokeCap)cap());
    renderPaint->join((StrokeJoin)join());
    return renderPaint;
}

bool Stroke::isVisible() const {
    return Super::isVisible() && thickness() > 0.0f;
}

void Stroke::draw(Renderer* renderer, CommandPath* path) {
    if (!isVisible()) {
        return;
    }

    if (m_Effect != nullptr) {
        /// We're guaranteed to get a metrics path here if we have an effect.
        path = m_Effect->effectPath(reinterpret_cast<MetricsPath*>(path));
    }

    renderer->drawPath(path->renderPath(), m_RenderPaint);
}

void Stroke::thicknessChanged() {
    assert(m_RenderPaint != nullptr);
    m_RenderPaint->thickness(thickness());
}

void Stroke::capChanged() {
    assert(m_RenderPaint != nullptr);
    m_RenderPaint->cap((StrokeCap)cap());
}

void Stroke::joinChanged() {
    assert(m_RenderPaint != nullptr);
    m_RenderPaint->join((StrokeJoin)join());
}

void Stroke::addStrokeEffect(StrokeEffect* effect) { m_Effect = effect; }

void Stroke::invalidateEffects() {
    if (m_Effect != nullptr) {
        m_Effect->invalidateEffect();
    }
}