#include "rive/constraints/transform_constraint.hpp"
#include "rive/transform_component.hpp"
#include "rive/math/mat2d.hpp"
#include <cmath>

using namespace rive;

void TransformConstraint::constrain(TransformComponent* component) {
    if (m_Target == nullptr) {
        return;
    }

    const Mat2D& transformA = component->worldTransform();
    Mat2D transformB(m_Target->worldTransform());
    if (sourceSpace() == TransformSpace::local) {
        const Mat2D& targetParentWorld = getParentWorld(*m_Target);

        Mat2D inverse;
        if (!Mat2D::invert(inverse, targetParentWorld)) {
            return;
        }
        transformB = inverse * transformB;
    }
    if (destSpace() == TransformSpace::local) {
        const Mat2D& targetParentWorld = getParentWorld(*component);
        transformB = targetParentWorld * transformB;
    }

    Mat2D::decompose(m_ComponentsA, transformA);
    Mat2D::decompose(m_ComponentsB, transformB);

    float angleA = std::fmod(m_ComponentsA.rotation(), (float)M_PI * 2);
    float angleB = std::fmod(m_ComponentsB.rotation(), (float)M_PI * 2);
    float diff = angleB - angleA;
    if (diff > M_PI) {
        diff -= M_PI * 2;
    } else if (diff < -M_PI) {
        diff += M_PI * 2;
    }

    float t = strength();
    float ti = 1.0f - t;

    m_ComponentsB.rotation(angleA + diff * t);
    m_ComponentsB.x(m_ComponentsA.x() * ti + m_ComponentsB.x() * t);
    m_ComponentsB.y(m_ComponentsA.y() * ti + m_ComponentsB.y() * t);
    m_ComponentsB.scaleX(m_ComponentsA.scaleX() * ti + m_ComponentsB.scaleX() * t);
    m_ComponentsB.scaleY(m_ComponentsA.scaleY() * ti + m_ComponentsB.scaleY() * t);
    m_ComponentsB.skew(m_ComponentsA.skew() * ti + m_ComponentsB.skew() * t);

    Mat2D::compose(component->mutableWorldTransform(), m_ComponentsB);
}
