#ifndef _RIVE_MAT2D_HPP_
#define _RIVE_MAT2D_HPP_

#include "rive/math/vec2d.hpp"
#include <cstddef>

namespace rive {
    class TransformComponents;
    class Mat2D {
    private:
        float m_Buffer[6];

    public:
        Mat2D() : m_Buffer{1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f} {}
        Mat2D(const Mat2D& copy) = default;
        Mat2D(float x1, float y1, float x2, float y2, float tx, float ty) :
            m_Buffer{x1, y1, x2, y2, tx, ty} {}

        inline const float* values() const { return m_Buffer; }

        float& operator[](std::size_t idx) { return m_Buffer[idx]; }
        const float& operator[](std::size_t idx) const { return m_Buffer[idx]; }

        static Mat2D fromRotation(float rad);
        static Mat2D fromScale(float sx, float sy) { return {sx, 0, 0, sy, 0, 0}; }
        static Mat2D fromTranslate(float tx, float ty) { return {1, 0, 0, 1, tx, ty}; }

        void scaleByValues(float sx, float sy);

        Mat2D& operator*=(const Mat2D& rhs) {
            *this = Mat2D::multiply(*this, rhs);
            return *this;
        }

        // If returns true, result holds the inverse.
        // If returns false, result is unchnaged.
        bool invert(Mat2D* result) const;

        Mat2D invertOrIdentity() const {
            Mat2D inverse;          // initialized to identity
            (void)invert(&inverse); // inverse is unchanged if invert() fails
            return inverse;
        }
    
        TransformComponents decompose() const;
        static Mat2D compose(const TransformComponents&);
        Mat2D scale(Vec2D) const;

        static Mat2D multiply(const Mat2D& a, const Mat2D& b);

        float xx() const { return m_Buffer[0]; }
        float xy() const { return m_Buffer[1]; }
        float yx() const { return m_Buffer[2]; }
        float yy() const { return m_Buffer[3]; }
        float tx() const { return m_Buffer[4]; }
        float ty() const { return m_Buffer[5]; }

        Vec2D translation() const { return {m_Buffer[4], m_Buffer[5]}; }

        void xx(float value) { m_Buffer[0] = value; }
        void xy(float value) { m_Buffer[1] = value; }
        void yx(float value) { m_Buffer[2] = value; }
        void yy(float value) { m_Buffer[3] = value; }
        void tx(float value) { m_Buffer[4] = value; }
        void ty(float value) { m_Buffer[5] = value; }
    };

    inline Vec2D operator*(const Mat2D& m, Vec2D v) {
        return {
            m[0] * v.x + m[2] * v.y + m[4],
            m[1] * v.x + m[3] * v.y + m[5],
        };
    }

    inline Mat2D operator*(const Mat2D& a, const Mat2D& b) { return Mat2D::multiply(a, b); }

    inline bool operator==(const Mat2D& a, const Mat2D& b) {
        return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3] && a[4] == b[4] &&
               a[5] == b[5];
    }
} // namespace rive
#endif
