#pragma once
#include "lua.h"
#include "space.h"

#define PLANET_METATABLE    "Planet"
#define SYSTEM_METATABLE    "System"
#define VECTOR_METATABLE    "Vec2"

/* Lua wrappers. */

/**
 * @brief Lua Planet wrapper.
 */
typedef struct LuaPlanet_s {
  Planet* p;
} LuaPlanet;
/**
 * @brief Lua StarSystem wrapper
 */
typedef struct LuaSystem_s {
  StarSystem* s;
} LuaSystem;
/**
 * @brief Lua Vec2 wrapper.
 */
typedef struct LuaVector_s {
  Vec2 vec;
} LuaVector;

/* Load the space library. */
int lua_loadSpace(lua_State* L, int readonly);
int lua_loadVector(lua_State* L);

/* Planet operations. */
LuaPlanet* lua_toplanet(lua_State* L, int ind);
LuaPlanet* lua_pushplanet(lua_State* L, LuaPlanet planet);
int lua_isplanet(lua_State* L, int ind);

/* System operations. */
LuaSystem* lua_tosystem(lua_State* L, int ind);
LuaSystem* lua_pushsystem(lua_State* L, LuaSystem sys);
int lua_issystem(lua_State* L, int ind);

/* Vector operations. */
LuaVector* lua_tovector(lua_State* L, int ind);
LuaVector* lua_pushvector(lua_State* L, LuaVector vec);
int lua_isvector(lua_State* L, int ind);