#include "rive/constraints/constraint.hpp"
#include "rive/container_component.hpp"
#include "rive/transform_component.hpp"
#include "rive/core_context.hpp"
#include "rive/math/mat2d.hpp"

using namespace rive;

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

	parent()->as<TransformComponent>()->addConstraint(this);

	return StatusCode::Ok;
}

void Constraint::markConstraintDirty()
{
	parent()->as<TransformComponent>()->markTransformDirty();
}

void Constraint::strengthChanged() { markConstraintDirty(); }

void Constraint::buildDependencies()
{
	Super::buildDependencies();
	parent()->addDependent(this);
}

void Constraint::onDirty(ComponentDirt dirt)
{
	// Whenever the constraint gets any dirt, make sure to mark the constrained
	// component dirty.
	markConstraintDirty();
}

static Mat2D identity;
const Mat2D& rive::getParentWorld(const TransformComponent& component)
{
	auto parent = component.parent();
	if (parent->is<WorldTransformComponent>())
	{
		return parent->as<WorldTransformComponent>()->worldTransform();
	}
	return identity;
}