#ifndef _RIVE_MAT4_HPP_
#define _RIVE_MAT4_HPP_

#include <cstddef>

namespace rive {
class Mat2D;
class Mat4 {
private:
    float m_Buffer[16];

public:
    Mat4() :
        m_Buffer{
            // clang-format off
                1.0f, 0.0f, 0.0f, 0.0f,
                0.0f, 1.0f, 0.0f, 0.0f,
                0.0f, 0.0f, 1.0f, 0.0f, 
                0.0f, 0.0f, 0.0f, 1.0f,
            // clang-format on
        } {}
    Mat4(const Mat4& copy) = default;

    // Construct a 4x4 Matrix with the provided elements stored in row-major
    // order.
    Mat4(
        // clang-format off
            float x1, float y1, float z1, float w1,
            float x2, float y2, float z2, float w2,
            float x3, float y3, float z3, float w3,
            float tx, float ty, float tz, float tw
        // clang-format on
        ) :
        m_Buffer{
            // clang-format off
                x1, y1, z1, w1,
                x2, y2, z2, w2,
                x3, y3, z3, w3,
                tx, ty, tz, tw,
            // clang-format on
        } {}

    Mat4(const Mat2D& mat2d);

    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]; }

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

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

    static Mat4 multiply(const Mat4& a, const Mat4& b);
    static Mat4 multiply(const Mat4& a, const Mat2D& b);
};
inline Mat4 operator*(const Mat4& a, const Mat4& b) { return Mat4::multiply(a, b); }
inline Mat4 operator*(const Mat4& a, const Mat2D& b) { return Mat4::multiply(a, b); }
} // namespace rive
#endif
