#include "StdAfx.h"
#include "ServerStatusManager.h"
#include "DirTools.h"
#include "DateTools.h"

#define	MAX_SYSTEM_LOG		200
#define	MAX_NOTIFY			200
#define	MAX_STATUS			200
#define	CLASS_NAME			_U8("StatusManager")


CServerStatusManager::CServerStatusManager(void)
{
	m_serverStatus = m_statusRoot.GetAccess(_U8("ServerStatus"));
}

CServerStatusManager::~CServerStatusManager(void)
{
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CServerStatusManager::Start(CIServerToolWrap serverTool)
{
	ASSERT(!m_init);
	m_init = TRUE;

	//	システムログ
	m_systemLog.Start(serverTool.GetIServerTool());
}

/*!
	停止
*/
void CServerStatusManager::Stop()
{
	//	初期化チェック
	if(!m_init)
		return;

	//	停止
	m_systemLog.Stop();

	m_init = FALSE;
}

/*!
	ログを出力
*/
void CServerStatusManager::WriteSystemLog(CUTF8String callerName, int logType, CUTF8String logString)
{
	//	ワークスペースをロック
	WORKSPACE_LOCK(m_serverStatus);

	//	安全のため
	logString.Replace(_U8("\r"), _U8("_"));
	logString.Replace(_U8("\n"), _U8("_"));

	//	最新アイテム取得
	CServerSystemLog systemLog = m_serverStatus.GetSystemLog().GetNewItem();
	systemLog.SetCaller(callerName);
	systemLog.SetLogType(logType);
	systemLog.SetLogString(logString);
	systemLog.SetTime(CDateTools::GetTimeString(CTime_t::GetCurrentTime()));

	//	アイテム数確認
	if(m_serverStatus.GetSystemLog().GetItemCount() > MAX_SYSTEM_LOG)
		m_serverStatus.GetSystemLog().DeleteItem(0);

	TRACE_U8(_U16("<%s> %s\n"), callerName, logString);

	//	必要ならログファイルへ
	if(logType <= SYSTEM_LOG_INFO_LOG)
		m_systemLog.WriteSystemLog(callerName, logString);

	//	必要なら通知
	if(logType <= SYSTEM_LOG_WARNING)
	{
		if(logType <= SYSTEM_LOG_ERROR)
			NotifyServerMessage(_U8("SystemLogErrorNotify"), _U16("エラーが発生しました: ") + logString, SYSTEM_MESSAGE_ERROR);
		else
			NotifyServerMessage(_U8("SystemLogWarningNotify"), _U16("警告が発生しました: ") + logString, SYSTEM_MESSAGE_WARNING, 60 * 60);	//	1時間で自動消去
	}
};


/*!
	サーバステータスの変更
*/
void CServerStatusManager::SetServerStatus(CUTF8String statusName, CUTF8String status, CUTF8String statusInfo, CUTF8String statusType)
{
	//	ワークスペースをロック
	WORKSPACE_LOCK(m_serverStatus);

	//	ステータス数確認
	if(m_serverStatus.GetServerStatusCount() >= MAX_STATUS)
		return;	//	これ以上追加不能

	//	エントリ取得
	CServerStatusEntry entry = m_serverStatus.GetServerStatusEntry(statusName);

	//	エントリ設定
	entry.SetStatus(status);
	if(!statusInfo.IsEmpty())
		entry.SetStatusInfo(statusInfo);
	if(!statusType.IsEmpty())
		entry.SetStatusType(statusType);
}

/*!
	サーバメッセージを通知
*/
void CServerStatusManager::NotifyServerMessage(CUTF8String messageID, CUTF8String message, int messageType, int autoOffTimeSec)
{
	//	ワークスペースをロック
	WORKSPACE_LOCK(m_serverStatus);

	//	ステータス数確認
	if(m_serverStatus.GetServerNotifyCount() >= MAX_NOTIFY)
		return;	//	これ以上追加不能

	//	エントリ取得
	CServerNotifyEntry entry = m_serverStatus.GetServerNotifyEntry(messageID);

	//	エントリ設定
	entry.SetMessageID(messageID);
	entry.SetMessage(message);
	entry.SetMessageType(messageType);
	entry.SetAutoOffTimeSec(autoOffTimeSec);
	entry.SetTime(CDateTools::GetTimeString(CTime_t::GetCurrentTime()));
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	取得
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	ステータス取得
*/
void CServerStatusManager::DuplicateStatus(CWorkspace &status)
{
	status.Duplicate(m_statusRoot);
}
