#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 "PathManager.h"
#include "MimeTypeManager.h"
#include "LogManager.h"
#include "ServerTextManager.h"

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

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

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

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

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

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

	//!	現在の接続ステータス取得
	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) { m_statusManager.SetServerStatusInt(statusName, status); };

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

	//!	設定の取得
	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 IResponseManagerPtr GetIResponseManager() { return m_responseManager.GetIResponseManager(); };

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

	//!	パスマネージャを取得
	virtual IPathManagerPtr GetIPathManager() { return m_pathManager.GetIPathManager(); };

	//!	MimeTypマネージャを取得
	virtual IMimeTypeManagerPtr GetIMimeTypeManager() { return m_mineTypeManager.GetIMimeTypeManager(); };

	//!	ログマネージャを取得
	virtual ILogManagerPtr GetILogManager() { return m_logManager.GetILogManager(); };

	//!	サーバテキストマネージャを取得
	virtual IServerTextManagerPtr GetIServerTextManager() { return m_serverTextManager.GetIServerTextManager(); };

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

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

	//!	リスナ
	CListenerManager		m_listenerManager;

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

	//!	アクセスログマネージャ
	CLogManager				m_logManager;

	//!	パスマネージャ
	CPathManager			m_pathManager;

	//!	MimeTypeマネージャ
	CMimeTypeManager		m_mineTypeManager;

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

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

	//!	サーバテキストマネージャ
	CServerTextManager		m_serverTextManager;

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