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

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

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

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

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

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


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

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

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

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

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

};


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

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

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

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

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

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

};


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

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


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

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


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

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