#ifndef _RIVE_TRANSFORM_COMPONENT_HPP_
#define _RIVE_TRANSFORM_COMPONENT_HPP_
#include "rive/generated/transform_component_base.hpp"
#include "rive/math/mat2d.hpp"

namespace rive {
    class Constraint;
    class WorldTransformComponent;
    class TransformComponent : public TransformComponentBase {
    private:
        Mat2D m_Transform;
        float m_RenderOpacity = 0.0f;
        WorldTransformComponent* m_ParentTransformComponent = nullptr;
        std::vector<Constraint*> m_Constraints;

    public:
#ifdef TESTING
        const std::vector<Constraint*>& constraints() const { return m_Constraints; }
#endif
        StatusCode onAddedClean(CoreContext* context) override;
        void buildDependencies() override;
        void update(ComponentDirt value) override;
        void updateTransform();
        void updateWorldTransform();
        void markTransformDirty();

        /// Opacity inherited by any child of this transform component. This'll
        /// later get overridden by effect layers.
        float childOpacity() override { return m_RenderOpacity; }
        float renderOpacity() const { return m_RenderOpacity; }

        const Mat2D& transform() const;

        /// Explicitly dangerous. Use transform/worldTransform when you don't
        /// need to transform things outside of their hierarchy.
        Mat2D& mutableTransform();

        virtual float x() const = 0;
        virtual float y() const = 0;

        void rotationChanged() override;
        void scaleXChanged() override;
        void scaleYChanged() override;

        void addConstraint(Constraint* constraint);
    };
} // namespace rive

#endif