#pragma once
#include "workspaceaccess.h"
#include "WorkspaceListAccess.h"

/*!
	システムログ
*/
class CServerSystemLog :
	public CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerSystemLog);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	呼び出し元
	DEFINE_PROPERTY_METHOD_STR(Caller, "Caller", "");

	//!	ステータス
	DEFINE_PROPERTY_METHOD_STR(LogString, "LogString", "");

	//!	発生時刻
	DEFINE_PROPERTY_METHOD_STR(Time, "Time", "");

	//!	コード
	DEFINE_PROPERTY_METHOD_INT(LogType, "LogType", 0);
};
typedef CWorkspaceTypedListAccess<CServerSystemLog, CWTLAName<'L', 'o', 'g'>> CServerSystemLogList;


/*!
	ステータス
*/
class CServerStatusEntry :
	public CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerStatusEntry);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ステータス名
	DEFINE_PROPERTY_METHOD_STR(StatusName, "StatusName", "");

	//!	状態
	DEFINE_PROPERTY_METHOD_STR(Status, "Status", "");

	//!	説明
	DEFINE_PROPERTY_METHOD_STR(StatusInfo, "StatusInfo", "");

	//!	形式
	DEFINE_PROPERTY_METHOD_STR(StatusType, "StatusType", "Integer");

};


/*!
	通知
*/
class CServerNotifyEntry :
	public CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerNotifyEntry);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ID
	DEFINE_PROPERTY_METHOD_STR(MessageID, "MessageID", "");

	//!	メッセージ
	DEFINE_PROPERTY_METHOD_STR(Message, "Message", "");

	//!	タイプ
	DEFINE_PROPERTY_METHOD_INT(MessageType, "MessageType", 0);

	//!	発生時刻
	DEFINE_PROPERTY_METHOD_STR(Time, "Time", "");

	//!	消去時間
	DEFINE_PROPERTY_METHOD_INT(AutoOffTimeSec, "AutoOffTimeSec", -1);

};


class CServerStatus :
	public CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerStatus);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	下位アクセス
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ステータスログを取得
	CServerSystemLogList GetSystemLog() { return GetAccess("SystemLog"); };


	//!	サーバステータスを取得
	CServerStatusEntry GetServerStatusEntry(CString statusName) { return GetAccess("Status::" + statusName); };

	//!	サーバステータス数を取得
	int GetServerStatusCount() { return GetAccess("Status").GetSubNodeCount(); }


	//!	通知を取得
	CServerNotifyEntry GetServerNotifyEntry(CString messageID) { return GetAccess("Notify::" + messageID); };

	//!	通知数を取得
	int GetServerNotifyCount() { return GetAccess("Notify").GetSubNodeCount(); }
};
