#include "rive/shapes/paint/dash.hpp"
#include "rive/shapes/paint/dash_path.hpp"

using namespace rive;

Dash::Dash() {}

Dash::Dash(float value, bool percentage)
{
  length(value);
  lengthIsPercentage(percentage);
}

float Dash::normalizedLength(float contourLength, bool wraps) const
{
  float p = length();
  if (wraps)
  {
    float right = lengthIsPercentage() ? 1.0f : contourLength;
    p = fmodf(length(), right);
    if (p < 0.0f)
    {
      p += right;
    }
  }
  return lengthIsPercentage() ? p * contourLength : p;
}

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

  return StatusCode::Ok;
}

void Dash::lengthChanged()
{
  if (parent() == nullptr || !parent()->is<DashPath>())
  {
    return;
  }
  parent()->as<DashPath>()->invalidateDash();
}

void Dash::lengthIsPercentageChanged() { lengthChanged(); }