#pragma once

#include "IServerTool.h"
#include "InterfaceManager.h"

#include "SettingManager.h"
#include "ServerStatusManager.h"
#include "ListenerManager.h"
#include "ConnectionThreadManager.h"

/*
#include "NewConnectionQueue.h"
#include "ResponseManager.h"
#include "FilterManager.h"
#include "SupportManagers.h"
*/

/*!
	サーバ操作用インタフェース
*/
class IServerControl
{
public:
	//!	サーバの開始
	virtual void StartServer() = 0;

	//!	サーバの停止
	virtual void StopServer() = 0;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	情報の取得
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	コンテキスト取得
	virtual void DuplicateCurrentContext(CWorkspace &contextRoot) = 0;

	//!	サーバステータス取得
	virtual void DuplicateServerStatus(CWorkspace &statusRoot) = 0  ;
};
//!	ポインタ型
typedef IServerControl* IServerControlPtr;


/*!
	サーバ本体
*/
class CServer : protected IServerTool, protected IServerControl
{
public:
	CServer(void);
	virtual ~CServer(void);

	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース取得
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	IServerControlインターフェースを取得
	IServerControlPtr GetIServerControl() { return this; };

	//!	デバッグ
	void Dump();

protected:
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース取得
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	IServerToolインターフェースを取得
	IServerToolPtr GetIServerTool() { return this; };

	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	IServerControl
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバの開始
	virtual void StartServer();

	//!	サーバの停止
	virtual void StopServer();

	//!	コンテキスト取得
	virtual void DuplicateCurrentContext(CWorkspace &contextRoot);

	//!	サーバステータス取得
	virtual void DuplicateServerStatus(CWorkspace &statusRoot);


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	IServerTool
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバステータスの変更
	virtual void WriteSystemLog(LPCU8STR callerName, int logType, LPCU8STR logString);

	//!	サーバステータスの変更
	virtual void SetServerStatus(LPCU8STR statusName, LPCU8STR status, LPCU8STR statusInfo = _U8(""), LPCU8STR statusType = _U8("String"));

	//!	サーバメッセージを通知
	virtual void NotifyServerMessage(LPCU8STR messageID, LPCU8STR message, int messageType, int autoOffTimeSec = -1);


	//!	ワークスペースへのアクセスを取得
	virtual int GetServerWorkspaceAccess(IWorkspaceAccessRefPtr accessRef, LPCU8STR type, LPCU8STR section);


	//!	インタフェース登録
	virtual int RegisterManagerInterface(LPCU8STR interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface);

	//!	インターフェース登録解除
	virtual int UnRegisterManagerInterface(LPCU8STR interfaceName, IManagerInterfacePtr ifUnRegister, IManagerInterfacePtr oldInterface);

	//!	インタフェース名を指定して取得
	virtual void *GetManagerInterface(LPCU8STR managerName, int interfaceVersion);


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	下位クラス
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	インタフェースマネージャ
	CInterfaceManager		m_interfaceManager;

	//!	設定マネージャ
	CSettingManager			m_settingManager;

	//!	ステータスマネージャ
	CServerStatusManager	m_statusManager;
/*
	//!	補助マネージャ
	CSupportManagers		m_supportManagers;

*/

	//!	リスナ
	CListenerManager		m_listenerManager;

	//!	接続マネージャ
	CConnectionThreadManager	m_connectionManager;

	/*
	//!	レスポンスマネージャ
	CResponseManager		m_responseManager;

	//!	フィルタマネージャ
	CFilterManager			m_filterManager;

*/

	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバ実行中
	CInterlockCounter		m_serverRunning;
};
