#ifndef __API_INIT_H
#define __API_INIT_H

#include <bfc/platform/platform.h>
#include <api/skin/widgets.h>
#include <bfc/string/bfcstring.h>
#include <api/syscb/api_syscbi.h>
#include <api/service/service.h>

class api_configI;
class SkinApi;
class api_makiI;
class MemMgrApi;
class TimerApi;
class WndApi;
class ForeignWnd;
class ClickWnd;

class ImgLdrApi;
#ifdef WASABI_COMPILE_FONTS
class FontApi;
#endif
#ifdef WASABI_COMPILE_WNDMGR
class WndMgrApi;
#endif
#ifdef WASABI_COMPILE_MAKIDEBUG
class MakiDebuggerApi;
#endif
#ifdef WASABI_COMPILE_FILEREADER
class FileReaderApi;
#endif
#ifdef WASABI_COMPILE_LOCALES
class api_localesI;
#endif
#ifndef WA3COMPATIBILITY
#ifdef WASABI_COMPILE_MEDIACORE
class Core;
#endif
#endif



#include <api/syscb/api_syscb.h>




#ifdef WASABI_COMPILE_MEDIACORE

#include <api/core/api_core.h>

class CoreApiService : public waServiceBase<api_core, CoreApiService> {
public:
  CoreApiService() : waServiceBase<api_core, CoreApiService>(coreApiServiceGuid) {}
  static const char *getServiceName() { return "Core API"; }
  virtual api_core *getService() { return coreApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#endif // WASABI_COMPILE_MEDIACORE

#ifdef WASABI_COMPILE_FILEREADER

#include <api/filereader/api_filereader.h>

class FileReaderApiService : public waServiceBase<api_fileReader, FileReaderApiService> {
public:
  FileReaderApiService() : waServiceBase<api_fileReader, FileReaderApiService>(fileReaderApiServiceGuid) {}
  static const char *getServiceName() { return "FileReader API"; }
  virtual api_fileReader *getService() { return fileApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#endif // WASABI_COMPILE_FILEREADER

#ifdef WASABI_COMPILE_CONFIG

#include <api/config/api_config.h>

class ConfigApiService : public waServiceBase<api_config, ConfigApiService> {
public:
  ConfigApiService() : waServiceBase<api_config, ConfigApiService>(configApiServiceGuid) {}
  static const char *getServiceName() { return "Config API"; }
  virtual api_config *getService() { return configApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#endif // WASABI_COMPILE_CONFIG

#ifdef WASABI_COMPILE_IMGLDR

#include <api/imgldr/api_imgldr.h>

class ImgLdrApiService: public waServiceBase<imgldr_api, ImgLdrApiService> {
public:
  ImgLdrApiService() : waServiceBase<imgldr_api, ImgLdrApiService>(imgLdrApiServiceGuid) {}
  static const char *getServiceName() { return "Image Loading API"; }
  virtual imgldr_api *getService() { return imgLoaderApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#endif // WASABI_COMPILE_IMGLDR

#ifdef WASABI_COMPILE_FONTS

#include <api/font/api_font.h>

class FontApiService : public waServiceBase<api_font, FontApiService> {
public:
  FontApiService() : waServiceBase<api_font, FontApiService>(fontApiServiceGuid) {}
  static const char *getServiceName() { return "Font Rendering API"; }
  virtual api_font *getService() { return fontApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#endif // WASABI_COMPILE_FONT


#include <api/locales/api_locales.h>

class LocalesApiService : public waServiceBase<api_locales, LocalesApiService> {
public:
  LocalesApiService() : waServiceBase<api_locales, LocalesApiService>(localesApiServiceGuid) {}
  static const char *getServiceName() { return "Locales API"; }
  virtual api_locales *getService() { return localesApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};



#include <api/wnd/api_wnd.h>

class WndApiService : public waServiceBase<wnd_api, WndApiService> {
public:
  WndApiService() : waServiceBase<wnd_api, WndApiService>(wndApiServiceGuid) {}
  static const char *getServiceName() { return "Windowing API"; }
  virtual wnd_api *getService() { return wndApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};


#include <api/wndmgr/api_wndmgr.h>

class WndMgrApiService : public waServiceBase<wndmgr_api, WndMgrApiService> {
public:
  WndMgrApiService() : waServiceBase<wndmgr_api, WndMgrApiService>(wndMgrApiServiceGuid) {}
  static const char *getServiceName() { return "Window Manager API"; }
  virtual wndmgr_api *getService() { return wndManagerApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#include <api/skin/api_skin.h>

class SkinApiService : public waServiceBase<api_skin, SkinApiService> {
public:
  SkinApiService() : waServiceBase<api_skin, SkinApiService>(skinApiServiceGuid) {}
  static const char *getServiceName() { return "Skinning API"; }
  virtual api_skin *getService() { return skinApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#include <api/script/api_maki.h>

class MakiApiService : public waServiceBase<api_maki, MakiApiService> {
public:
  MakiApiService() : waServiceBase<api_maki, MakiApiService>(makiApiServiceGuid) {}
  static const char *getServiceName() { return "MAKI Scripting API"; }
  virtual api_maki *getService() { return makiApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#ifdef WASABI_COMPILE_MAKIDEBUG

#include <api/script/debugger/api_makidebug.h>

class MakiDebugApiService : public waServiceBase<api_makiDebugger, MakiDebugApiService> {
public:
  MakiDebugApiService() : waServiceBase<api_makiDebugger, MakiDebugApiService>(makiDebugApiServiceGuid) {}
  static const char *getServiceName() { return "MAKI Debugger API"; }
  virtual api_makiDebugger *getService() { return debugApi; }
  static FOURCC getServiceType() { return WaSvc::UNIQUE; }
};

#endif // WASABI_COMPILE_SKIN

class ApiInit 
{
public:
  static int init(OSMODULEHANDLE hinstance, OSWINDOWHANDLE mainwnd, api_service *wa5_svc); // 0 == error, 1 == success
  static int shutdown(); // 0 == error, 1 == success
  static int getInitCount(); // if you do init / shutdown more than once in the session, this may be useful to invalid some caches

private:
  #ifdef WASABI_COMPILE_SKIN
  #ifdef WASABI_COMPILE_COMPONENTS
  static waServiceFactoryI * groupcreate;
  #endif //WASABI_COMPILE_COMPONENTS
  #endif //WASABI_COMPILE_SKIN

  static waServiceFactoryI * win32Font;
  static FontApiService *fontapisvc;

public:
  static Widgets * widgets;
private:
  static SkinApiService *skinapisvc;

  static api_configI * cfg;
  static ConfigApiService *cfgapisvc;
  static ImgLdrApi * img;
  static ImgLdrApiService *imgldrapisvc;

  #ifdef WASABI_COMPILE_FONTS
  static FontApi * font;
  #endif

  #ifdef WASABI_COMPILE_FILEREADER
  static FileReaderApi * fr;
  #ifdef WASABI_COMPILE_ZIPREADER
  static waServiceFactoryI * zipRead;
  #endif
  static FileReaderApiService *frapisvc;
  #endif

  static api_localesI *loc;
  static LocalesApiService *localesapisvc;

  static WndApi * wnd;
  static ForeignWnd * mainWnd;
  static ClickWnd * default_mainWnd;
  static WndApiService *wndapisvc;

  static WndMgrApi * wndmgr;
  static WndMgrApiService *wndmgrapisvc;


  static api_makiI * maki;
  static MakiApiService *makiapisvc;

  static SkinApi * skin;

  #ifdef WASABI_COMPILE_MAKIDEBUG
  static MakiDebuggerApi * debug;
  static MakiDebugApiService *makidebugapisvc;
  #endif

  #ifdef WASABI_COMPILE_MEDIACORE
  static CoreApiService *coreapisvc;
  #endif

  static int initcount;
};

#endif