#ifndef _RIVE_MAT4_HPP_
#define _RIVE_MAT4_HPP_

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

namespace rive
{
// Column-major 4x4 single-precision matrix. The 64-byte storage can be
// uploaded directly to a GPU uniform buffer.
//
// Column 0 = m[0..3], Column 1 = m[4..7], Column 2 = m[8..11], Column 3 =
// m[12..15].
class Mat4
{
public:
  constexpr Mat4()
      : m_buffer{
            {1.f,
             0.f,
             0.f,
             0.f,
             0.f,
             1.f,
             0.f,
             0.f,
             0.f,
             0.f,
             1.f,
             0.f,
             0.f,
             0.f,
             0.f,
             1.f}}
  {}

  constexpr Mat4(
      float c0x,
      float c0y,
      float c0z,
      float c0w,
      float c1x,
      float c1y,
      float c1z,
      float c1w,
      float c2x,
      float c2y,
      float c2z,
      float c2w,
      float c3x,
      float c3y,
      float c3z,
      float c3w)
      : m_buffer{
            {c0x,
             c0y,
             c0z,
             c0w,
             c1x,
             c1y,
             c1z,
             c1w,
             c2x,
             c2y,
             c2z,
             c2w,
             c3x,
             c3y,
             c3z,
             c3w}}
  {}

  const float* values() const { return m_buffer.data(); }
  float* values() { return m_buffer.data(); }

  float& operator[](size_t i) { return m_buffer[i]; }
  float operator[](size_t i) const { return m_buffer[i]; }

  static Mat4 identity() { return Mat4(); }

  static Mat4 fromTranslation(float x, float y, float z)
  {
    Mat4 m;
    m.m_buffer[12] = x;
    m.m_buffer[13] = y;
    m.m_buffer[14] = z;
    return m;
  }

  static Mat4 fromScale(float sx, float sy, float sz)
  {
    Mat4 m;
    m.m_buffer[0] = sx;
    m.m_buffer[5] = sy;
    m.m_buffer[10] = sz;
    return m;
  }

  static Mat4 fromRotationX(float rad)
  {
    float c = std::cos(rad), s = std::sin(rad);
    Mat4 m;
    m.m_buffer[5] = c;
    m.m_buffer[6] = s;
    m.m_buffer[9] = -s;
    m.m_buffer[10] = c;
    return m;
  }

  static Mat4 fromRotationY(float rad)
  {
    float c = std::cos(rad), s = std::sin(rad);
    Mat4 m;
    m.m_buffer[0] = c;
    m.m_buffer[2] = -s;
    m.m_buffer[8] = s;
    m.m_buffer[10] = c;
    return m;
  }

  static Mat4 fromRotationZ(float rad)
  {
    float c = std::cos(rad), s = std::sin(rad);
    Mat4 m;
    m.m_buffer[0] = c;
    m.m_buffer[1] = s;
    m.m_buffer[4] = -s;
    m.m_buffer[5] = c;
    return m;
  }

  // Right-handed perspective. Maps view-space z=[-near, -far] to NDC z in
  // either [0, 1] (default, depthZeroToOne=true) or [-1, 1].
  static Mat4 perspective(
      float fovYRadians,
      float aspect,
      float near_,
      float far_,
      bool depthZeroToOne = true)
  {
    float f = 1.f / std::tan(fovYRadians * 0.5f);
    float nf = 1.f / (near_ - far_);
    Mat4 m{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    m.m_buffer[0] = f / aspect;
    m.m_buffer[5] = f;
    if (depthZeroToOne)
    {
      m.m_buffer[10] = far_ * nf;
      m.m_buffer[14] = far_ * near_ * nf;
    }
    else
    {
      m.m_buffer[10] = (far_ + near_) * nf;
      m.m_buffer[14] = 2.f * far_ * near_ * nf;
    }
    m.m_buffer[11] = -1.f;
    return m;
  }

  // Right-handed perspective with reverse-Z (near -> 1, far -> 0) and an
  // infinite far plane. Combined with a float depth buffer this gives a
  // near-uniform 1/z depth distribution across the entire frustum — the
  // best precision an arbitrary scene can hope for. See Upchurch & Desbrun,
  // "Tightening the Precision of Perspective Rendering" (2012).
  //
  // Caller's depth buffer must be cleared to 0 (not 1) and the depth test
  // flipped (GREATER, not LESS).
  static Mat4 perspectiveReverseZ(float fovYRadians, float aspect, float near_)
  {
    float f = 1.f / std::tan(fovYRadians * 0.5f);
    Mat4 m{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    m.m_buffer[0] = f / aspect;
    m.m_buffer[5] = f;
    m.m_buffer[10] = 0.f;
    m.m_buffer[11] = -1.f;
    m.m_buffer[14] = near_;
    return m;
  }

  // Right-handed view matrix looking from `eye` toward `center` (GLM
  // convention). `up` need not be normalized.
  static Mat4 lookAt(
      const float eye[3],
      const float center[3],
      const float up[3])
  {
    float f[3] = {center[0] - eye[0], center[1] - eye[1], center[2] - eye[2]};
    float fInv = 1.f / std::sqrt(f[0] * f[0] + f[1] * f[1] + f[2] * f[2]);
    f[0] *= fInv;
    f[1] *= fInv;
    f[2] *= fInv;
    float s[3] = {
        f[1] * up[2] - f[2] * up[1],
        f[2] * up[0] - f[0] * up[2],
        f[0] * up[1] - f[1] * up[0]};
    float sInv = 1.f / std::sqrt(s[0] * s[0] + s[1] * s[1] + s[2] * s[2]);
    s[0] *= sInv;
    s[1] *= sInv;
    s[2] *= sInv;
    float u[3] = {
        s[1] * f[2] - s[2] * f[1],
        s[2] * f[0] - s[0] * f[2],
        s[0] * f[1] - s[1] * f[0]};
    Mat4 m;
    m.m_buffer[0] = s[0];
    m.m_buffer[1] = u[0];
    m.m_buffer[2] = -f[0];
    m.m_buffer[4] = s[1];
    m.m_buffer[5] = u[1];
    m.m_buffer[6] = -f[1];
    m.m_buffer[8] = s[2];
    m.m_buffer[9] = u[2];
    m.m_buffer[10] = -f[2];
    m.m_buffer[12] = -(s[0] * eye[0] + s[1] * eye[1] + s[2] * eye[2]);
    m.m_buffer[13] = -(u[0] * eye[0] + u[1] * eye[1] + u[2] * eye[2]);
    m.m_buffer[14] = f[0] * eye[0] + f[1] * eye[1] + f[2] * eye[2];
    return m;
  }

  // Right-handed orthographic projection. Maps view-space z=[-near, -far]
  // to NDC z in either [0, 1] (default, depthZeroToOne=true) or [-1, 1].
  static Mat4 ortho(
      float left,
      float right,
      float bottom,
      float top,
      float near_,
      float far_,
      bool depthZeroToOne = true)
  {
    Mat4 m;
    m.m_buffer[0] = 2.f / (right - left);
    m.m_buffer[5] = 2.f / (top - bottom);
    m.m_buffer[12] = -(right + left) / (right - left);
    m.m_buffer[13] = -(top + bottom) / (top - bottom);
    if (depthZeroToOne)
    {
      m.m_buffer[10] = -1.f / (far_ - near_);
      m.m_buffer[14] = -near_ / (far_ - near_);
    }
    else
    {
      m.m_buffer[10] = -2.f / (far_ - near_);
      m.m_buffer[14] = -(far_ + near_) / (far_ - near_);
    }
    return m;
  }

  // SIMD: out = lhs * rhs. Both column-major.
  static Mat4 multiply(const Mat4& lhs, const Mat4& rhs)
  {
    // Each output column j is a linear combination of lhs's columns
    // weighted by rhs's column j.
    const float* L = lhs.m_buffer.data();
    const float* R = rhs.m_buffer.data();
    float4 c0 = simd::load4f(L);
    float4 c1 = simd::load4f(L + 4);
    float4 c2 = simd::load4f(L + 8);
    float4 c3 = simd::load4f(L + 12);

    Mat4 out;
    for (int j = 0; j < 4; ++j)
    {
      const float* rcol = R + j * 4;
      float4 result = c0 * rcol[0] + c1 * rcol[1] + c2 * rcol[2] + c3 * rcol[3];
      simd::store(out.m_buffer.data() + j * 4, result);
    }
    return out;
  }

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

  // SIMD: out = lhs * rhs, assuming both are affine (bottom row
  // [0, 0, 0, 1]). Skips the four FMAs that would multiply lhs's bottom-
  // row zeros and the rhs[3]=0 entries of the first three columns.
  //
  // Result is always affine. Passing a non-affine input gives an
  // incorrect result — callers must ensure the contract.
  static Mat4 multiplyAffine(const Mat4& lhs, const Mat4& rhs)
  {
    const float* L = lhs.m_buffer.data();
    const float* R = rhs.m_buffer.data();
    float4 c0 = simd::load4f(L);      // [_,_,_,0]
    float4 c1 = simd::load4f(L + 4);  // [_,_,_,0]
    float4 c2 = simd::load4f(L + 8);  // [_,_,_,0]
    float4 c3 = simd::load4f(L + 12); // [_,_,_,1]

    Mat4 out;
    // Cols 0..2: rhs[3] is 0, so the c3*rhs[3] term vanishes.
    for (int j = 0; j < 3; ++j)
    {
      const float* rcol = R + j * 4;
      float4 result = c0 * rcol[0] + c1 * rcol[1] + c2 * rcol[2];
      simd::store(out.m_buffer.data() + j * 4, result);
    }
    // Col 3: rhs[3] is 1, so c3 contributes directly.
    {
      const float* rcol = R + 12;
      float4 result = c0 * rcol[0] + c1 * rcol[1] + c2 * rcol[2] + c3;
      simd::store(out.m_buffer.data() + 12, result);
    }
    return out;
  }

  // SIMD: out = M * (x, y, z, w). Returns a 4-component vector (xyzw).
  void transformVec4(float out[4], float x, float y, float z, float w) const
  {
    float4 c0 = simd::load4f(m_buffer.data());
    float4 c1 = simd::load4f(m_buffer.data() + 4);
    float4 c2 = simd::load4f(m_buffer.data() + 8);
    float4 c3 = simd::load4f(m_buffer.data() + 12);
    simd::store(out, c0 * x + c1 * y + c2 * z + c3 * w);
  }

  Mat4 transposed() const
  {
    Mat4 t;
    for (int r = 0; r < 4; ++r)
      for (int c = 0; c < 4; ++c)
        t.m_buffer[r * 4 + c] = m_buffer[c * 4 + r];
    return t;
  }

  // Returns true and writes inverse if invertible. Otherwise returns false
  // and `result` is unchanged. Cofactor method.
  bool invert(Mat4* result) const
  {
    const float* m = m_buffer.data();
    float inv[16];

    inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] +
             m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10];
    inv[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] +
             m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] +
             m[12] * m[7] * m[10];
    inv[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] +
             m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9];
    inv[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] +
              m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] +
              m[12] * m[6] * m[9];
    inv[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] +
             m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] +
             m[13] * m[3] * m[10];
    inv[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] +
             m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10];
    inv[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] -
             m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9];
    inv[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] +
              m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9];
    inv[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] +
             m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6];
    inv[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] -
             m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6];
    inv[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] +
              m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5];
    inv[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] -
              m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5];
    inv[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] -
             m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6];
    inv[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] +
             m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6];
    inv[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] -
              m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5];
    inv[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] +
              m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5];

    float det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12];
    if (det == 0.f)
      return false;
    float invDet = 1.f / det;
    for (int i = 0; i < 16; ++i)
      (*result)[i] = inv[i] * invDet;
    return true;
  }

  // Closed-form inverse for affine matrices (bottom row [0, 0, 0, 1]).
  // Inverts the 3x3 linear part R via cofactors, then writes -R^-1 * t
  // into the translation column. Much smaller and faster than the full
  // 4x4 cofactor `invert`.
  //
  // Returns false (and leaves `result` unchanged) only if the linear part
  // is singular. Caller must ensure the input is actually affine.
  bool invertAffine(Mat4* result) const
  {
    const float* m = m_buffer.data();
    // The 3x3 linear part R has R[row][col] = m[col*4 + row].
    // Cofactors C[i][j] of column 0 of R, expanded for det along col 0.
    float c00 = m[5] * m[10] - m[6] * m[9];
    float c10 = m[6] * m[8] - m[4] * m[10];
    float c20 = m[4] * m[9] - m[5] * m[8];
    float det = m[0] * c00 + m[1] * c10 + m[2] * c20;
    if (det == 0.f)
      return false;
    float invDet = 1.f / det;
    // Remaining 6 cofactors.
    float c01 = m[2] * m[9] - m[1] * m[10];
    float c02 = m[1] * m[6] - m[2] * m[5];
    float c11 = m[0] * m[10] - m[2] * m[8];
    float c12 = m[2] * m[4] - m[0] * m[6];
    float c21 = m[1] * m[8] - m[0] * m[9];
    float c22 = m[0] * m[5] - m[1] * m[4];

    // R^-1 = (cofactor matrix)^T / det, so Rinv[i][j] = C[j][i] / det.
    // Naming below: ri_j = Rinv[i][j].
    float r0_0 = c00 * invDet, r0_1 = c10 * invDet, r0_2 = c20 * invDet;
    float r1_0 = c01 * invDet, r1_1 = c11 * invDet, r1_2 = c21 * invDet;
    float r2_0 = c02 * invDet, r2_1 = c12 * invDet, r2_2 = c22 * invDet;

    // Translation column: -R^-1 * t.
    float tx = m[12], ty = m[13], tz = m[14];
    float ix = -(r0_0 * tx + r0_1 * ty + r0_2 * tz);
    float iy = -(r1_0 * tx + r1_1 * ty + r1_2 * tz);
    float iz = -(r2_0 * tx + r2_1 * ty + r2_2 * tz);

    // Store column-major: o[col*4 + row] = Rinv[row][col].
    float* o = result->m_buffer.data();
    o[0] = r0_0;
    o[1] = r1_0;
    o[2] = r2_0;
    o[3] = 0.f;
    o[4] = r0_1;
    o[5] = r1_1;
    o[6] = r2_1;
    o[7] = 0.f;
    o[8] = r0_2;
    o[9] = r1_2;
    o[10] = r2_2;
    o[11] = 0.f;
    o[12] = ix;
    o[13] = iy;
    o[14] = iz;
    o[15] = 1.f;
    return true;
  }

private:
  std::array<float, 16> m_buffer;
};

static_assert(
    std::is_trivially_destructible<Mat4>::value,
    "Mat4 must be trivially destructible");
static_assert(
    sizeof(Mat4) == 16 * sizeof(float),
    "Mat4 must be 64 bytes (no padding)");

inline bool operator==(const Mat4& a, const Mat4& b)
{
  for (size_t i = 0; i < 16; ++i)
    if (a[i] != b[i])
      return false;
  return true;
}
inline bool operator!=(const Mat4& a, const Mat4& b) { return !(a == b); }

} // namespace rive
#endif
