#ifdef RIVE_WASM_MODULE
// The script module's ScriptingContext: enough for the compiled-in binding
// files, whose only host contact is factory() and the print/pcall policy.
#include "rive/lua/rive_lua_libs.hpp"
#include "rive/wasm/module_render.hpp"

#include "lualib.h"

#include <stdio.h>

using namespace rive;

int luaopen_rive_path(lua_State* L);
int luaopen_rive_gradient(lua_State* L);
int luaopen_rive_paint(lua_State* L);
int luaopen_rive_renderer(lua_State* L);
int luaopen_rive_image(lua_State* L);
int luaopen_rive_mesh(lua_State* L);
int luaopen_rive_blob(lua_State* L);

namespace
{
class ModuleScriptingContext : public ScriptingContext
{
public:
  ModuleScriptingContext() : ScriptingContext(wasmModuleFactory()) {}

  void printError(lua_State* state) override
  {
    const char* message = lua_tostring(state, -1);
    fprintf(stderr, "script error: %s\n", message ? message : "?");
  }
  void printBeginLine(lua_State*) override {}
  void print(Span<const char> data) override
  {
    fwrite(data.data(), 1, data.size(), stdout);
  }
  void printEndLine() override { fputc('\n', stdout); }
  int pCall(lua_State* state, int nargs, int nresults) override
  {
    int status = lua_pcall(state, nargs, nresults, 0);
    if (status != LUA_OK)
    {
      printError(state);
    }
    return status;
  }
};
} // namespace

namespace rive
{
ScriptingContext* wasmModuleContext()
{
  static ModuleScriptingContext context;
  return &context;
}

// Path caching keys on the artboard frame id, which lives host side. A
// constant here makes every dirty rebuild count as same-frame, which
// allocates a fresh render path instead of rewinding — conservative and
// never stale.
uint64_t Artboard::sm_frameId = 0;

// The module has no async work pool.
void ScriptingContext::shutdownAsync() {}

// Host side this is a helper in the Luau backend TU; the blob only needs
// the ref pushed.
int rive_lua_pushRef(lua_State* L, int ref)
{
  lua_getref(L, ref);
  return 1;
}
} // namespace rive

// Rendering surface for the module: the untouched binding files over the
// handle-backed proxies.
int luaopen_rive_renderer_module(lua_State* L)
{
  return luaopen_rive_path(L) + luaopen_rive_gradient(L) +
         luaopen_rive_paint(L) + luaopen_rive_renderer(L) +
         luaopen_rive_image(L) + luaopen_rive_mesh(L) + luaopen_rive_blob(L);
}

#endif
