/*
g++ -c cpptest.cpp
g++ -shared cpptest.o -o cpptest.so

copy command.so to Mineserver bin directory.


*/

#include <string>
#include <deque>
#include <ctime>
#include <sstream>
#include <cstdlib>

#include "../../src/plugin_api.h"


#define PLUGIN_COMMAND_VERSION 1.1
const char CHATCMDPREFIX   = '/';
mineserver_pointer_struct* mineserver_pointer;

std::string dtos( double n )
{
  std::ostringstream result;
  result << n;
  return result.str();
}


class Plugin
{
public:
 float getPluginVersion(const std::string name)
 {
   return mineserver_pointer->plugin.getPluginVersion(name);
 }
  void setPluginVersion(const std::string name, float version)
 {
   mineserver_pointer->plugin.setPluginVersion(name,version);
 }
};

class myMap
{
public:

  void createPickupSpawn(int x, int y, int z, int type, int count, int health, std::string user)
  {
   mineserver_pointer->map.createPickupSpawn(x,y,z,type,count,health,user);
  }
  bool setTime(std::string timeValue)
  {
   return mineserver_pointer->map.setTime(timeValue);
  }
  void getSpawn(int* x, int* y, int* z)
  {
    mineserver_pointer->map.getSpawn(x,y,z);
  }
  bool getBlock(int x, int y, int z, unsigned char* type,unsigned char* meta)
  {
    return mineserver_pointer->map.getBlock(x,y,z,type,meta);
  }
  bool setBlock(int x, int y, int z, unsigned char type,unsigned char meta)
  {
    return mineserver_pointer->map.setBlock(x,y,z,type,meta);
  }
};

class Callback
{
public:
  bool add_hook(std::string name, void *function)
  {
    return mineserver_pointer->callback.add_hook(name,function);
  }
};

class Screen
{
public:
  void log(std::string message)
  {
    mineserver_pointer->screen.log(message);
  }
};

class Mineserver
{
public:

 Plugin plugin;
 myMap map;
 Callback callback;
 Screen screen;
};

Mineserver mineserver;

PLUGIN_API_EXPORT void command_init(mineserver_pointer_struct* mineserver_temp)
{
  mineserver_pointer = mineserver_temp;
  if (mineserver.plugin.getPluginVersion("command") > 0)
  {
    mineserver.screen.log("command is already loaded v." +dtos(mineserver.plugin.getPluginVersion("command")));
    return;
  }
  mineserver.screen.log("Loaded \"command\"!");

  mineserver.plugin.setPluginVersion("command", PLUGIN_COMMAND_VERSION);

//  mineserver.callback.add_hook("ChatPre", (void *)chatPreFunction);
//  mineserver.callback.add_hook("BlockPlacePre", (void *)blockPlacePreFunction);

}

PLUGIN_API_EXPORT void command_shutdown(void)
{
  if (mineserver.plugin.getPluginVersion("command") <= 0)
  {
    mineserver.screen.log("command is not loaded!");
    return;
  }

}
