#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;
}