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

using namespace rive;

void ScaleConstraint::constrain(TransformComponent* component)
{
    const Mat2D& transformA = component->worldTransform();
    Mat2D transformB;
    m_ComponentsA = transformA.decompose();
    if (m_Target == nullptr)
    {
        transformB = transformA;
        m_ComponentsB = m_ComponentsA;
    }
    else
    {
        transformB = m_Target->worldTransform();
        if (sourceSpace() == TransformSpace::local)
        {
            Mat2D inverse;
            if (!getParentWorld(*m_Target).invert(&inverse))
            {
                return;
            }
            transformB = inverse * transformB;
        }
        m_ComponentsB = transformB.decompose();

        if (!doesCopy())
        {
            m_ComponentsB.scaleX(destSpace() == TransformSpace::local ? 1.0f
                                                                      : m_ComponentsA.scaleX());
        }
        else
        {
            m_ComponentsB.scaleX(m_ComponentsB.scaleX() * copyFactor());
            if (offset())
            {
                m_ComponentsB.scaleX(m_ComponentsB.scaleX() * component->scaleX());
            }
        }

        if (!doesCopyY())
        {
            m_ComponentsB.scaleY(destSpace() == TransformSpace::local ? 1.0f
                                                                      : m_ComponentsA.scaleY());
        }
        else
        {
            m_ComponentsB.scaleY(m_ComponentsB.scaleY() * copyFactorY());
            if (offset())
            {
                m_ComponentsB.scaleY(m_ComponentsB.scaleY() * component->scaleY());
            }
        }

        if (destSpace() == TransformSpace::local)
        {
            // Destination space is in parent transform coordinates. Recompose
            // the parent local transform and get it in world, then decompose
            // the world for interpolation.

            transformB = Mat2D::compose(m_ComponentsB);
            transformB = getParentWorld(*component) * transformB;
            m_ComponentsB = transformB.decompose();
        }
    }

    bool clamplocal = minMaxSpace() == TransformSpace::local;
    if (clamplocal)
    {
        // Apply min max in local space, so transform to local coordinates
        // first.
        transformB = Mat2D::compose(m_ComponentsB);
        Mat2D inverse;
        if (!getParentWorld(*component).invert(&inverse))
        {
            return;
        }
        transformB = inverse * transformB;
        m_ComponentsB = transformB.decompose();
    }
    if (max() && m_ComponentsB.scaleX() > maxValue())
    {
        m_ComponentsB.scaleX(maxValue());
    }
    if (min() && m_ComponentsB.scaleX() < minValue())
    {
        m_ComponentsB.scaleX(minValue());
    }
    if (maxY() && m_ComponentsB.scaleY() > maxValueY())
    {
        m_ComponentsB.scaleY(maxValueY());
    }
    if (minY() && m_ComponentsB.scaleY() < minValueY())
    {
        m_ComponentsB.scaleY(minValueY());
    }
    if (clamplocal)
    {
        // Transform back to world.
        transformB = Mat2D::compose(m_ComponentsB);
        transformB = getParentWorld(*component) * transformB;
        m_ComponentsB = transformB.decompose();
    }

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

    m_ComponentsB.rotation(m_ComponentsA.rotation());
    m_ComponentsB.x(m_ComponentsA.x());
    m_ComponentsB.y(m_ComponentsA.y());
    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());

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