#pragma once
#include "InterfaceWrapperMacro.h"
#include "IServerTool.h"
#include "ILogManager.h"
#include "IServerTextManager.h"
#include "IMimeTypeManager.h"
#include "IPathManager.h"
#include "ICGIManager.h"
#include "IServerInfoManager.h"

#include "ServerStatus.h"
#include "ServerInfo.h"
#include "ServerException.h"


/*!
	IServerToolのラッパ
*/
class CIServerToolWrap
{
public:
	//!	色々宣言
	DEFINE_MANAGER_WRAPPER_CONSTRUCTOR(CIServerToolWrap, IServerTool, 1);

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	設定
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	マネージャの個別設定を取得
	virtual CWorkspaceAccess GetManagerSetting(CString section)
	{
		CWorkspaceAccess	temp;
		m_ifPtr->GetServerWorkspaceAccess(temp.GetIWorkspaceAccessRef(), MANAGER_SETTING, section);
		return(temp);
	}

	//!	フィルタの個別設定を取得
	virtual CWorkspaceAccess GetFilterSetting(CString section)
	{
		CWorkspaceAccess	temp;
		m_ifPtr->GetServerWorkspaceAccess(temp.GetIWorkspaceAccessRef(), FILTER_SETTING, section);
		return(temp);
	}

	//!	レスポンスの個別設定を取得
	virtual CWorkspaceAccess GetResponseSetting(CString section)
	{
		CWorkspaceAccess	temp;
		m_ifPtr->GetServerWorkspaceAccess(temp.GetIWorkspaceAccessRef(), RESPONSE_SETTING, section);
		return(temp);
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	ステータス・ログ
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバログの書き込み
	virtual void WriteSystemLog(CString callerName, int logType, CString logString)
	{
		m_ifPtr->WriteSystemLog(callerName, logType, logString);
	}

	//!	サーバステータスの変更
	virtual void SetServerStatusInt(CString statusName, int status, CString statusInfo = "", CString statusType = "Interger")
	{
		//	文字列化
		TCHAR	str[80] = _T("");
		_itot_s(status, str, 80, 10);

		//	設定
		m_ifPtr->SetServerStatus(statusName, str, statusInfo, statusType);
	}

	//!	サーバステータスの変更
	virtual void SetServerStatusStr(CString statusName, CString status, CString statusInfo = "", CString statusType = "String")
	{
		m_ifPtr->SetServerStatus(statusName, status, statusInfo, statusType);
	}

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

	//!	現在のサーバステータスを取得
	virtual CServerStatus GetServerStatus()
	{
		CWorkspaceAccess	temp;
		m_ifPtr->GetServerWorkspaceAccess(temp.GetIWorkspaceAccessRef(), SERVER_STATUS, NULL);
		return(temp);
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース管理
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	インタフェース登録
	virtual int RegisterManagerInterface(LPCSTR interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface = NULL)
	{
		return m_ifPtr->RegisterManagerInterface(interfaceName, ifRegister, oldInterface);
	}

	//!	インターフェース登録解除
	virtual int UnRegisterManagerInterface(LPCSTR interfaceName, IManagerInterfacePtr ifUnRegister, IManagerInterfacePtr oldInterface = NULL)
	{
		return m_ifPtr->UnRegisterManagerInterface(interfaceName, ifUnRegister, oldInterface);
	}

	//!	インタフェース取得
	virtual void *GetManagerInterface(LPCSTR interfaceName, int ifVersion, int enableException = TRUE)
	{
		//	取得を試みる
		void *ifPtr = m_ifPtr->GetManagerInterface(interfaceName, ifVersion);

		//	エラーチェック
		if(ifPtr == NULL && enableException)
			throw CManagerInterfaceException(interfaceName, ifVersion);

		return(ifPtr);
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース取得
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	パスマネージャを取得
	virtual CIPathManagerWrap GetIPathManager()
	{
		return (IPathManagerPtr)GetManagerInterface(CIPathManagerWrap::GetInterfaceName(), CIPathManagerWrap::GetInterfaceVersion());
	}

	//!	MimeTypeマネージャを取得
	virtual CIMimeTypeManagerWrap GetIMimeTypeManager()
	{
		return (IMimeTypeManagerPtr)GetManagerInterface(CIMimeTypeManagerWrap::GetInterfaceName(), CIMimeTypeManagerWrap::GetInterfaceVersion());
	}

	//!	ログマネージャを取得
	virtual CILogManagerWrap GetILogManager()
	{
		return (ILogManagerPtr)GetManagerInterface(CILogManagerWrap::GetInterfaceName(), CILogManagerWrap::GetInterfaceVersion());
	}

	//!	サーバテキストマネージャを取得
	virtual CIServerTextManagerWrap GetIServerTextManager()
	{
		return (IServerTextManagerPtr)GetManagerInterface(CIServerTextManagerWrap::GetInterfaceName(), CIServerTextManagerWrap::GetInterfaceVersion());
	};

	//!	CGIマネージャを取得
	virtual CICGIManagerWrap GetICGIManager()
	{
		return (ICGIManagerPtr)GetManagerInterface(CICGIManagerWrap::GetInterfaceName(), CICGIManagerWrap::GetInterfaceVersion());
	}

	//!	サーバ情報マネージャを取得
	virtual CIServerInfoManagerWrap GetIServerInfoManager()
	{
		return (IServerInfoManagerPtr)GetManagerInterface(CIServerInfoManagerWrap::GetInterfaceName(), CIServerInfoManagerWrap::GetInterfaceVersion());
	}
};
