#ifndef _RIVE_CONSTRAINT_HPP_
#define _RIVE_CONSTRAINT_HPP_
#include "rive/generated/constraints/constraint_base.hpp"
#include <stdio.h>
namespace rive
{
class TransformComponent;
class Mat2D;
class TransformComponents;

class Constraint : public ConstraintBase
{
public:
    void strengthChanged() override;
    StatusCode onAddedDirty(CoreContext* context) override;
    virtual void markConstraintDirty();
    virtual void constrain(TransformComponent* component) = 0;
    void buildDependencies() override;
    void onDirty(ComponentDirt dirt) override;
#ifdef WITH_RIVE_EDITOR
    void editorParentChanged(ContainerComponent* from,
                             ContainerComponent* to) override;
#endif

protected:
    /// Writes composed into the component's world transform, keeping its
    /// anchor where it already was. A layout's box starts at its local zero,
    /// so recomposing about that zero would swing the box about its corner
    /// rather than its origin.
    static void composeKeepingAnchor(TransformComponent* component,
                                     const TransformComponents& composed);
    /// Steps the component's world translation back by its anchor, so a
    /// position already written as "where local zero goes" instead lands the
    /// anchor there. Scaled by strength so zero strength stays a no-op.
    static void landAnchor(TransformComponent* component, float strength);
    /// Composes, then lands the anchor — for constraints that copy a position.
    static void composeLandingAnchor(TransformComponent* component,
                                     const TransformComponents& composed,
                                     float strength);
    /// The component's world transform displaced by [offset] applied in its
    /// parent's frame — for constraints that move a component by a delta
    /// measured in the space the layout was solved in.
    static Mat2D offsetInParentFrame(TransformComponent* component,
                                     const Mat2D& offset);
};

const Mat2D& getParentWorld(const TransformComponent& component);
} // namespace rive

#endif