#include "rive/transform_component.hpp"
#include "rive/world_transform_component.hpp"
#include "rive/shapes/clipping_shape.hpp"
#include "rive/math/vec2d.hpp"
#include "rive/constraints/constraint.hpp"

using namespace rive;

StatusCode TransformComponent::onAddedClean(CoreContext* context)
{
    m_ParentTransformComponent = parent() != nullptr && parent()->is<WorldTransformComponent>()
                                     ? parent()->as<WorldTransformComponent>()
                                     : nullptr;
    return StatusCode::Ok;
}

void TransformComponent::buildDependencies()
{
    if (parent() != nullptr)
    {
        parent()->addDependent(this);
    }
}

void TransformComponent::markTransformDirty()
{
    if (!addDirt(ComponentDirt::Transform))
    {
        return;
    }
    markWorldTransformDirty();
}

void TransformComponent::updateTransform()
{
    m_Transform = Mat2D::fromRotation(rotation());
    m_Transform[4] = x();
    m_Transform[5] = y();
    m_Transform.scaleByValues(scaleX(), scaleY());
}

void TransformComponent::updateWorldTransform()
{
    if (m_ParentTransformComponent != nullptr)
    {
        m_WorldTransform = m_ParentTransformComponent->m_WorldTransform * m_Transform;
    }
    else
    {
        m_WorldTransform = m_Transform;
    }

    for (auto constraint : m_Constraints)
    {
        constraint->constrain(this);
    }
}

void TransformComponent::update(ComponentDirt value)
{
    if (hasDirt(value, ComponentDirt::Transform))
    {
        updateTransform();
    }
    if (hasDirt(value, ComponentDirt::WorldTransform))
    {
        updateWorldTransform();
    }
    if (hasDirt(value, ComponentDirt::RenderOpacity))
    {
        m_RenderOpacity = opacity();
        if (m_ParentTransformComponent != nullptr)
        {
            m_RenderOpacity *= m_ParentTransformComponent->childOpacity();
        }
    }
}

const Mat2D& TransformComponent::transform() const { return m_Transform; }

Mat2D& TransformComponent::mutableTransform() { return m_Transform; }

void TransformComponent::rotationChanged() { markTransformDirty(); }
void TransformComponent::scaleXChanged() { markTransformDirty(); }
void TransformComponent::scaleYChanged() { markTransformDirty(); }

void TransformComponent::addConstraint(Constraint* constraint)
{
    m_Constraints.push_back(constraint);
}
