#ifdef WITH_RIVE_SCRIPTING
#include "lua.h"
#include "lualib.h"
#include "rive/lua/rive_lua_libs.hpp"
#include "rive/factory.hpp"

using namespace rive;

static void fill_stops(
    lua_State* L,
    std::vector<float>& stops,
    std::vector<ColorInt>& colors)
{
  luaL_checktype(L, 3, LUA_TTABLE);
  int index = 1;
  while (true)
  {
    if (lua_rawgeti(L, 3, index++) != LUA_TTABLE)
    {
      lua_pop(L, 1);
      break;
    }
    lua_rawgetfield(L, -1, "position");
    float position = float(luaL_checknumber(L, -1));
    lua_pop(L, 1);
    lua_rawgetfield(L, -1, "color");
    uint32_t color = luaL_checkunsigned(L, -1);

    stops.push_back(position);
    colors.push_back(color);
    lua_pop(L, 2); // color and the stop table
  }
}
static int gradient_linear(lua_State* L)
{
  Vec2D from = *lua_checkvec2d(L, 1);
  Vec2D to = *lua_checkvec2d(L, 2);

  std::vector<float> stops;
  std::vector<ColorInt> colors;
  fill_stops(L, stops, colors);

  ScriptedGradient* gradient = lua_newrive<ScriptedGradient>(L);
  ScriptingContext* context = static_cast<ScriptingContext*>(
      lua_getthreaddata(L));

  gradient->shader = context->factory()->makeLinearGradient(
      from.x,
      from.y,
      to.x,
      to.y,
      colors.data(),
      stops.data(),
      stops.size());
  return 1;
}

static int gradient_radial(lua_State* L)
{
  Vec2D from = *lua_checkvec2d(L, 1);
  auto radius = luaL_checknumber(L, 2);
  std::vector<float> stops;
  std::vector<ColorInt> colors;
  fill_stops(L, stops, colors);

  ScriptedGradient* gradient = lua_newrive<ScriptedGradient>(L);
  ScriptingContext* context = static_cast<ScriptingContext*>(
      lua_getthreaddata(L));

  gradient->shader = context->factory()->makeRadialGradient(
      from.x,
      from.y,
      radius,
      colors.data(),
      stops.data(),
      stops.size());
  return 1;
}

static const luaL_Reg gradientStaticMethods[] = {
    {"linear", gradient_linear},
    {"radial", gradient_radial},
    {nullptr, nullptr}};

int luaopen_rive_gradient(lua_State* L)
{
  luaL_register(L, ScriptedGradient::luaName, gradientStaticMethods);
  lua_register_rive<ScriptedGradient>(L);

  return 1;
}

#endif
