#ifndef _RIVE_TRANSFORMCOMPONENTS_HPP_
#define _RIVE_TRANSFORMCOMPONENTS_HPP_

#include "rive/math/vec2d.hpp"

namespace rive {
    class TransformComponents {
    private:
        float m_X;
        float m_Y;
        float m_ScaleX;
        float m_ScaleY;
        float m_Rotation;
        float m_Skew;

    public:
        TransformComponents() :
            m_X(0.0f), m_Y(0.0f), m_ScaleX(1.0f), m_ScaleY(1.0f), m_Rotation(0.0f), m_Skew(0.0f) {}
        TransformComponents(const TransformComponents& copy) :
            m_X(copy.m_X),
            m_Y(copy.m_Y),
            m_ScaleX(copy.m_ScaleX),
            m_ScaleY(copy.m_ScaleY),
            m_Rotation(copy.m_Rotation),
            m_Skew(copy.m_Skew) {}

        float x() const { return m_X; }
        void x(float value) { m_X = value; }
        float y() const { return m_Y; }
        void y(float value) { m_Y = value; }
        float scaleX() const { return m_ScaleX; }
        void scaleX(float value) { m_ScaleX = value; }
        float scaleY() const { return m_ScaleY; }
        void scaleY(float value) { m_ScaleY = value; }
        float rotation() const { return m_Rotation; }
        void rotation(float value) { m_Rotation = value; }
        float skew() const { return m_Skew; }
        void skew(float value) { m_Skew = value; }

        Vec2D translation() const { return {m_X, m_Y}; }
        Vec2D scale() const { return {m_ScaleX, m_ScaleY}; }

        TransformComponents& operator=(const TransformComponents& a) {
            m_X = a.m_X;
            m_Y = a.m_Y;
            m_ScaleX = a.m_ScaleX;
            m_ScaleY = a.m_ScaleY;
            m_Rotation = a.m_Rotation;
            m_Skew = a.m_Skew;
            return *this;
        }
    };
} // namespace rive
#endif
