/*!
	CServerStatusManager

	サーバステータスマネージャ
	各モジュールの出力するステータス情報を保管する
*/

#pragma once
#include "ServerStatus.h"
#include "ServerToolWrap.h"
#include "SyncObject.h"
#include "SystemLogManager.h"

class CServerStatusManager
{
public:
	CServerStatusManager(void);
	virtual ~CServerStatusManager(void);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(CIServerToolWrap serverTool);

	//!	停止
	void Stop();

	//!	ログを出力
	void WriteSystemLog(CString callerName, int logType, CString logString);

	//!	サーバステータスの変更
	void SetServerStatus(CString statusName, CString status, CString statusInfo, CString statusType);

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

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	取得
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ステータス取得
	void DuplicateStatus(CWorkspace &status);

	//!	ステータス取得
	CServerStatus GetStatus()
	{
		return m_serverStatus;
	}


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

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

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

protected:
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	クリティカルセクション
	CCriticalSection	m_scopeLock;

	//!	ステータス保持
	CWorkspace			m_statusRoot;

	//!	サーバステータス
	CServerStatus		m_serverStatus;

	//!	初期化フラグ
	CInterlockCounter	m_init;

	//!	システムログ
	CSystemLogManager	m_systemLog;
};
