#include "lua_camera.h"
#define method(name) {#name, Camera::l_##name}

namespace OpenGTA {
  namespace Script {

using namespace OpenGL;

    int Camera::l_setSpeed(lua_State *L) {
      float tmp = float(luaL_checknumber(L, 1));
      CameraHolder::Instance().setSpeed(tmp);
      return 0;
    }
    int Camera::l_setRotating(lua_State *L) {
      bool b = lua_toboolean(L, 1);
      CameraHolder::Instance().setRotating(b);
      return 0;
    }
    int Camera::l_getEye(lua_State *L) {
      Vector3D & e = CameraHolder::Instance().getEye();
      lua_pushnumber(L, e.x);
      lua_pushnumber(L, e.y);
      lua_pushnumber(L, e.z);
      return 3;
    }
    int Camera::l_setEye(lua_State *L) {
      Vector3D & e = CameraHolder::Instance().getEye();
      e.x = luaL_checknumber(L, 1);
      e.y = luaL_checknumber(L, 2);
      e.z = luaL_checknumber(L, 3);
      return 0;
    }
    int Camera::l_getCenter(lua_State *L) {
      Vector3D & e = CameraHolder::Instance().getCenter();
      lua_pushnumber(L, e.x);
      lua_pushnumber(L, e.y);
      lua_pushnumber(L, e.z);
      return 3;
    }
    int Camera::l_setCenter(lua_State *L) {
      Vector3D & e = CameraHolder::Instance().getCenter();
      e.x = luaL_checknumber(L, 1);
      e.y = luaL_checknumber(L, 2);
      e.z = luaL_checknumber(L, 3);
      return 0;
    }
    int Camera::l_getUp(lua_State *L) {
      Vector3D & e = CameraHolder::Instance().getUp();
      lua_pushnumber(L, e.x);
      lua_pushnumber(L, e.y);
      lua_pushnumber(L, e.z);
      return 0;
    }
    int Camera::l_setUp(lua_State *L) {
      Vector3D & e = CameraHolder::Instance().getUp();
      e.x = luaL_checknumber(L, 1);
      e.y = luaL_checknumber(L, 2);
      e.z = luaL_checknumber(L, 3);
      return 0;
    }
    int Camera::l_setGravityOn(lua_State *L) {
      bool v = lua_toboolean(L, 1);
      CameraHolder::Instance().setCamGravity(v);
      return 0;
    }
    int Camera::l_interpolateToPosition(lua_State *L) {
      float x, y, z;
      x = float(luaL_checknumber(L, 1));
      y = float(luaL_checknumber(L, 2));
      z = float(luaL_checknumber(L, 3));
      Uint32 msecInterval = Uint32(luaL_checkinteger(L, 4));
      CameraHolder::Instance().interpolate(Vector3D(x, y, z), 1, msecInterval);
      return 0;
    }


    const luaL_reg Camera::methods[] = {
      method(setSpeed),
      method(setRotating),
      method(setEye),
      method(getEye),
      method(setCenter),
      method(getCenter),
      method(getUp),
      method(setUp),
      method(setGravityOn),
      method(interpolateToPosition),
      {NULL, NULL}
    };
  }
}