#ifdef WITH_RIVE_SCRIPTING
#include "rive/math/mat2d.hpp"
#include "rive/lua/rive_lua_libs.hpp"

using namespace rive;

static ScriptedMat2D* lua_pushmat2d(
    lua_State* L,
    float x1,
    float y1,
    float x2,
    float y2,
    float tx,
    float ty)
{
  return lua_newrive<ScriptedMat2D>(L, x1, y1, x2, y2, tx, ty);
}

static ScriptedMat2D* lua_pushmat2d(lua_State* L, const Mat2D& mat)
{
  return lua_newrive<ScriptedMat2D>(L, mat);
}

static int mat2d_values(lua_State* L)
{
  float m[6] = {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f};
  for (int i = 0; i < 6; i++)
  {
    m[i] = float(luaL_checknumber(L, 1 + i));
  }

  lua_pushmat2d(L, m[0], m[1], m[2], m[3], m[4], m[5]);
  return 1;
}

static int mat2d_identity(lua_State* L)
{
  lua_pushmat2d(L, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
  return 1;
}

static int mat2d_withTranslation(lua_State* L)
{
  auto vec = lua_tovec2d(L, 1);
  if (vec != nullptr)
  {
    lua_pushmat2d(L, Mat2D::fromTranslation(*vec));
    return 1;
  }

  float x = float(luaL_checknumber(L, 1));
  float y = float(luaL_checknumber(L, 2));

  lua_pushmat2d(L, Mat2D::fromTranslation(Vec2D(x, y)));

  return 1;
}

static int mat2d_withRotation(lua_State* L)
{
  float radians = float(luaL_checknumber(L, 1));

  lua_pushmat2d(L, Mat2D::fromRotation(radians));

  return 1;
}

static int mat2d_withScale(lua_State* L)
{
  auto scale = lua_tovec2d(L, 1);
  if (scale != nullptr)
  {
    lua_pushmat2d(L, Mat2D::fromScale(scale->x, scale->y));
    return 1;
  }
  float scaleX = float(luaL_checknumber(L, 1));
  float scaleY = lua_isnumber(L, 2) ? float(luaL_checknumber(L, 2)) : scaleX;

  lua_pushmat2d(L, Mat2D::fromScale(scaleX, scaleY));

  return 1;
}

static int mat2d_withScaleAndTranslation(lua_State* L)
{
  auto scale = lua_tovec2d(L, 1);
  if (scale != nullptr)
  {
    auto translation = lua_checkvec2d(L, 2);
    lua_pushmat2d(
        L,
        Mat2D::fromScaleAndTranslation(
            scale->x,
            scale->y,
            translation->x,
            translation->y));
    return 1;
  }
  float scaleX = float(luaL_checknumber(L, 1));
  float scaleY = float(luaL_checknumber(L, 2));
  float translationX = float(luaL_checknumber(L, 3));
  float translationY = float(luaL_checknumber(L, 4));

  lua_pushmat2d(
      L,
      Mat2D::fromScaleAndTranslation(
          scaleX,
          scaleY,
          translationX,
          translationY));

  return 1;
}

static int mat2d_newindex(lua_State* L)
{
  auto mat = lua_torive<ScriptedMat2D>(L, 1);

  size_t namelen = 0;
  const char* name = luaL_checklstring(L, 2, &namelen);
  switch (namelen)
  {
    case 2:
      switch (name[0])
      {
        case 'x':
          switch (name[1])
          {
            case 'x':
              mat->value.xx(luaL_checknumber(L, 3));
              return 0;
            case 'y':
              mat->value.xy(luaL_checknumber(L, 3));
              return 0;
          }
          break;
        case 'y':
          switch (name[1])
          {
            case 'x':
              mat->value.yx(luaL_checknumber(L, 3));
              return 0;
            case 'y':
              mat->value.yy(luaL_checknumber(L, 3));
              return 0;
          }
          break;
        case 't':
          switch (name[1])
          {
            case 'x':
              mat->value.tx(luaL_checknumber(L, 3));
              return 0;
            case 'y':
              mat->value.ty(luaL_checknumber(L, 3));
              return 0;
          }
          return 1;
        default:
          break;
      }
      break;
    case 1:
      switch (name[0])
      {
        case '1':
          mat->value.xx(luaL_checknumber(L, 3));
          return 0;
        case '2':
          mat->value.xy(luaL_checknumber(L, 3));
          return 0;
        case '3':
          mat->value.yx(luaL_checknumber(L, 3));
          return 0;
        case '4':
          mat->value.yy(luaL_checknumber(L, 3));
          return 0;
        case '5':
          mat->value.tx(luaL_checknumber(L, 3));
          return 0;
        case '6':
          mat->value.ty(luaL_checknumber(L, 3));
          return 0;
        default:
          break;
      }
      break;
  }

  luaL_error(
      L,
      "'%s' is not a valid index of %s",
      name,
      ScriptedMat2D::luaName);
  return 0;
}

// Direct field getters for the 2-char alphabetic names (xx, xy, yx, yy, tx,
// ty). The slow path still handles numeric-string keys ('1'..'6') since
// those are less common and not worth a per-name registration.

static void mat2d_direct_xx(void* udata, void* result)
{
  lua_userdatadirectfield_setnumber(
      result,
      ((ScriptedMat2D*)udata)->value.xx());
}

static void mat2d_direct_xy(void* udata, void* result)
{
  lua_userdatadirectfield_setnumber(
      result,
      ((ScriptedMat2D*)udata)->value.xy());
}

static void mat2d_direct_yx(void* udata, void* result)
{
  lua_userdatadirectfield_setnumber(
      result,
      ((ScriptedMat2D*)udata)->value.yx());
}

static void mat2d_direct_yy(void* udata, void* result)
{
  lua_userdatadirectfield_setnumber(
      result,
      ((ScriptedMat2D*)udata)->value.yy());
}

static void mat2d_direct_tx(void* udata, void* result)
{
  lua_userdatadirectfield_setnumber(
      result,
      ((ScriptedMat2D*)udata)->value.tx());
}

static void mat2d_direct_ty(void* udata, void* result)
{
  lua_userdatadirectfield_setnumber(
      result,
      ((ScriptedMat2D*)udata)->value.ty());
}

static int mat2d_index(lua_State* L)
{
  auto mat = lua_torive<ScriptedMat2D>(L, 1);

  size_t namelen = 0;
  const char* name = luaL_checklstring(L, 2, &namelen);
  switch (namelen)
  {
    case 2:
      switch (name[0])
      {
        case 'x':
          switch (name[1])
          {
            case 'x':
              lua_pushnumber(L, mat->value.xx());
              return 1;
            case 'y':
              lua_pushnumber(L, mat->value.xy());
              return 1;
          }
          break;
        case 'y':
          switch (name[1])
          {
            case 'x':
              lua_pushnumber(L, mat->value.yx());
              return 1;
            case 'y':
              lua_pushnumber(L, mat->value.yy());
              return 1;
          }
          break;
        case 't':
          switch (name[1])
          {
            case 'x':
              lua_pushnumber(L, mat->value.tx());
              return 1;
            case 'y':
              lua_pushnumber(L, mat->value.ty());
              return 1;
          }
          return 1;
        default:
          break;
      }
      break;
    case 1:
      switch (name[0])
      {
        case '1':
          lua_pushnumber(L, mat->value.xx());
          return 1;
        case '2':
          lua_pushnumber(L, mat->value.xy());
          return 1;
        case '3':
          lua_pushnumber(L, mat->value.yx());
          return 1;
        case '4':
          lua_pushnumber(L, mat->value.yy());
          return 1;
        case '5':
          lua_pushnumber(L, mat->value.tx());
          return 1;
        case '6':
          lua_pushnumber(L, mat->value.ty());
          return 1;
        default:
          break;
      }
      break;
  }

  luaL_error(
      L,
      "'%s' is not a valid index of %s",
      name,
      ScriptedMat2D::luaName);
  return 0;
}

static int mat2d_mul(lua_State* L)
{
  auto mat2d = lua_torive<ScriptedMat2D>(L, 1);
  auto vec = lua_tovec2d(L, 2);
  if (vec != nullptr)
  {
    lua_pushvec2d(L, mat2d->value * (*vec));
    return 1;
  }
  auto rhs = lua_torive<ScriptedMat2D>(L, 2);

  lua_pushmat2d(L, mat2d->value * rhs->value);
  return 1;
}

static int mat2d_invert(lua_State* L)
{
  auto mat2d = lua_torive<ScriptedMat2D>(L, 1);
  Mat2D result;
  if (mat2d->value.invert(&result))
  {
    lua_pushmat2d(L, result);
    return 1;
  }
  lua_pushnil(L);
  return 1;
}

static int mat2d_isIdentity(lua_State* L)
{
  auto mat2d = lua_torive<ScriptedMat2D>(L, 1);
  lua_pushboolean(L, mat2d->value == Mat2D());
  return 1;
}

static int mat2d_eq(lua_State* L)
{
  auto lhs = lua_torive<ScriptedMat2D>(L, 1);
  auto rhs = lua_torive<ScriptedMat2D>(L, 2);
  lua_pushboolean(L, lhs->value == rhs->value);
  return 1;
}

static int mat2d_namecall(lua_State* L)
{
  int atom;
  if (lua_namecallatom(L, &atom))
  {
    switch (atom)
    {
      case (int)LuaAtoms::invert:
        return mat2d_invert(L);
      case (int)LuaAtoms::isIdentity:
        return mat2d_isIdentity(L);
    }
  }

  luaL_error(
      L,
      "%s is not a valid method of %s",
      luaL_checkstring(L, 1),
      ScriptedMat2D::luaName);
  return 0;
}

static int mat2d_static_invert(lua_State* L)
{
  auto out = lua_torive<ScriptedMat2D>(L, 1);
  auto in = lua_torive<ScriptedMat2D>(L, 2);

  if (in->value.invert(&out->value))
  {
    lua_pushboolean(L, 1);
  }
  else
  {
    lua_pushboolean(L, 0);
  }

  return 1;
}

static const luaL_Reg mat2dStaticMethods[] = {
    {"withTranslation", mat2d_withTranslation},
    {"withRotation", mat2d_withRotation},
    {"withScale", mat2d_withScale},
    {"withScaleAndTranslation", mat2d_withScaleAndTranslation},
    {"identity", mat2d_identity},
    {"values", mat2d_values},
    {"invert", mat2d_static_invert},
    {nullptr, nullptr}};

int luaopen_rive_mat2d(lua_State* L)
{
  luaL_register(L, ScriptedMat2D::luaName, mat2dStaticMethods);
  lua_register_rive<ScriptedMat2D>(L);

  lua_pushcfunction(L, mat2d_index, nullptr);
  lua_setfield(L, -2, "__index");

  lua_pushcfunction(L, mat2d_newindex, nullptr);
  lua_setfield(L, -2, "__newindex");

  lua_pushcfunction(L, mat2d_mul, nullptr);
  lua_setfield(L, -2, "__mul");

  lua_pushcfunction(L, mat2d_eq, nullptr);
  lua_setfield(L, -2, "__eq");

  lua_pushcfunction(L, mat2d_namecall, nullptr);
  lua_setfield(L, -2, "__namecall");

  lua_setreadonly(L, -1, true);
  lua_pop(L, 1); // pop the metatable

  uint8_t tag = ScriptedMat2D::luaTag;
  lua_registeruserdatadirectfieldget(L, tag, "xx", mat2d_direct_xx);
  lua_registeruserdatadirectfieldget(L, tag, "xy", mat2d_direct_xy);
  lua_registeruserdatadirectfieldget(L, tag, "yx", mat2d_direct_yx);
  lua_registeruserdatadirectfieldget(L, tag, "yy", mat2d_direct_yy);
  lua_registeruserdatadirectfieldget(L, tag, "tx", mat2d_direct_tx);
  lua_registeruserdatadirectfieldget(L, tag, "ty", mat2d_direct_ty);
  return 1;
}

#endif
