#include "rive/bones/bone.hpp"
#include "rive/math/vec2d.hpp"
#include <algorithm>

using namespace rive;

void Bone::addChildBone(Bone* bone) { m_ChildBones.push_back(bone); }

StatusCode Bone::onAddedClean(CoreContext* context)
{
  Super::onAddedClean(context);
  if (!parent()->is<Bone>())
  {
    return StatusCode::MissingObject;
  }
  parent()->as<Bone>()->addChildBone(this);
  return StatusCode::Ok;
}

void Bone::lengthChanged()
{
  for (auto bone : m_ChildBones)
  {
    bone->markTransformDirty();
  }
}

float Bone::x() const { return parent()->as<Bone>()->length(); }

float Bone::y() const { return 0.0f; }

Vec2D Bone::tipWorldTranslation() const
{
  return worldTransform() * Vec2D(length(), 0);
}

void Bone::addPeerConstraint(Constraint* peer)
{
  assert(
      std::find(m_PeerConstraints.begin(), m_PeerConstraints.end(), peer) ==
      m_PeerConstraints.end());
  m_PeerConstraints.push_back(peer);
}
