#pragma once

#include "IServerTool.h"
#include "SettingManager.h"
#include "NewConnectionQueue.h"
#include "ListenerManager.h"
#include "ConnectionManager.h"
#include "ServerStatusManager.h"

#include "ResponseManager.h"
#include "FilterManager.h"
#include "ManagerInterfaceManager.h"

class CServer : protected IServerTool, protected IServerControl
{
public:
	CServer(void);
	virtual ~CServer(void);

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

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

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

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

	//!	現在の接続ステータス取得
	virtual CWorkspaceAccess GetConnectionInfo() { return CWorkspaceAccess(); };


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	IServerTool
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバステータスの変更
	virtual void WriteSystemLog(CString callerName, int statusCode, CString statusInfo, int autoOffTime = -1) { m_statusManager.WriteSystemLog(callerName, statusCode, statusInfo, autoOffTime); };

	//!	サーバステータスの変更
	virtual void SetServerStatusInt(CString statusName, int status, CString statusInfo = "") { m_statusManager.SetServerStatusInt(statusName, status, statusInfo); };

	//!	サーバステータスの変更
	virtual void SetServerStatusStr(CString statusName, CString status, CString statusInfo = "") { m_statusManager.SetServerStatusStr(statusName, status, statusInfo); };


	//!	設定の取得
	virtual CWorkspaceAccess GetManagerSetting(CString section){ return m_settingManager.GetManagerSetting(section); };

	//!	設定の取得
	virtual CWorkspaceAccess GetFilterSetting(CString section) { return m_settingManager.GetFilterSetting(section); };

	//!	設定の取得
	virtual CWorkspaceAccess GetResponseSetting(CString section) { return m_settingManager.GetResponseSetting(section); };


	//!	現在のサーバステータスを取得
	virtual CServerStatus GetServerStatus() { return m_statusManager.GetStatus(); };


	//!	レスポンスマネージャ取得
	virtual IResponseManagerIIPtr GetIResponseManager() { return m_responseManager.GetIResponseManager(); };

	//!	取得
	virtual IFilterManagerIIPtr GetIFilterManager() { return m_filterManager.GetIFilterManager(); };


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	下位クラス
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	設定マネージャ
	CSettingManager				m_settingManager;

	//!	ステータスマネージャ
	CServerStatusManager		m_statusManager;

	//!	リスナ
	CListenerManager			m_listenerManager;

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

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

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

	//!	マネージャインタフェースマネージャ
	CManagerInterfaceManager	m_interfaceManager;


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