/*!
	CServerStatusManager

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

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

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

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

	//!	停止
	void Stop();

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

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

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

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

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


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

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

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

protected:
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ステータス保持
	CWorkspace				m_statusRoot;

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

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

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