#ifndef RT_UserManager_C_H_
#define RT_UserManager_C_H_

#include "common_c.h"

typedef rtc::UserStatus AVDUserStatus;

/**
* 用户数据结构.
*
* 用户数据定义了用户的基本信息。
*/
typedef struct _AVDUser {
	char   userId[Max_UserId];						/**< 用户Id，应用层可设置 */
	char   userName[Max_UserName];					/**< 用户名称，应用层设置  */
	char   userData[Max_UserData];					/**< 用户数据，应用层设置  */
	AVDUserStatus status;							/**< 用户状态集合  */
	_AVDUser() {
		memset(userId, 0, sizeof(userId));
		memset(userName, 0, sizeof(userName));
		memset(userData, 0, sizeof(userData));
	}
	bool isValid() const { return userId[0] != 0; }
}AVDUser, *LPAVDUser;

/**
* 用户管理回调接口类
*
* 用户管理回调接口定义了房间用户和用户列表操作的异步返回，房间用户通知。
*/
typedef struct UserManager_Callback {
	/// 通知
	/** 用户加入房间通知
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] user 用户信息数据。
	*
	* @note 某用户调用房间中的avd_room_join加入房间后，房间内所有用户会接收到此通知
	* @sa avd_room_join
	*/
	void(*usermanager_onUserJoinNotify)(AVDHandle usermHandle, const AVDUser& user);
	/** 用户离开房间通知
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] user 用户信息数据。
	*
	* @note 某用户调用房间中的avd_room_leave离开房间后，房间内所有用户会接收到此通知
	* @sa avd_room_leave
	*/
	void(*usermanager_onUserLeaveNotify)(AVDHandle usermHandle, const AVDUser& user);
	/** 用户离开房间通知
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] reason 离会原因
	* @param[in] user 用户信息数据。
	*
	* @note 某用户调用房间中的avd_room_leave离开房间后，房间内所有用户会接收到此通知
	* @sa avd_room_leave
	*/
	void(*usermanager_onUserLeaveNotifyReson)(AVDHandle usermHandle, Result reason, const AVDUser& user);
	/** 用户信息更改通知
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] user 用户信息数据。
	*
	* @note 某用户调用avd_usermanager_updateUser更改自己信息后，房间内所有用户会接收到此通知
	* @sa avd_usermanager_updateUser
	*/
	void(*usermanager_onUserUpdateNotify)(AVDHandle usermHandle, const AVDUser& user);
	/** 用户状态更改通知
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] status 当前用户状态。
	* @param[in] *fromId 关联的用户Id。
	*
	* @note 某用户调用avd_usermanager_updateSelfUserStatus更改自己状态后，房间内所有用户会接收到此通知；
	*       此通知从usermanager_onUserUpdateNotify中分离出来，因用户状态更改较为频繁
	* @sa avd_usermanager_updateSelfUserStatus
	* @sa usermanager_onUserUpdateNotify
	*/
	void(*usermanager_onUserStatusNotify)(AVDHandle usermHandle, AVDUserStatus status, const char* fromId);
	/** 用户应用层数据更改通知
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] *userData 当前用户应用层数据。
	* @param[in] size 应用层数据长度。
	* @param[in] fromId 关联的用户Id。
	*
	* @note 某用户调用updateSelfUserData更改自己应用层数据后，房间内所有用户会接收到此通知
	*       此通知从onUserUpdateNotify中分离出来，因应用层数据用户较为关注
	* @sa updateSelfUserData
	* @sa onUserUpdateNotify
	*/
	void(*usermanager_onUserDataNotify)(AVDHandle usermHandle, const char* userData, uint32 size, const char* fromId);
	UserManager_Callback() {
		usermanager_onUserJoinNotify = NULL;
		usermanager_onUserLeaveNotify = NULL;
		usermanager_onUserLeaveNotifyReson = NULL;
		usermanager_onUserUpdateNotify = NULL;
		usermanager_onUserStatusNotify = NULL;
		usermanager_onUserDataNotify = NULL;
	}
}*LPUserManager_Callback;

///

extern "C" {
	/**
	* 用户管理接口类
	*
	* 用户管理接口定义了房间内所有用户和用户列表相关的功能操作。
	*/

	/** 初始化用户管理接口
	*
	* @param[in] roomHandle 房间句柄。
	* @param[in] cb 用户管理回调接口指针。
	* @param[out] usermHandle 用户管理模块句柄。
	* @return 返回错误代码。
	* @sa UserManager_Callback
	*/
	RT_API_EXPORT Result avd_usermanager_init(AVDHandle roomHandle, LPUserManager_Callback cb, AVDHandle& usermHandle);
	RT_API_EXPORT AVDHandle avd_usermanager_gethandle(AVDHandle roomHandle);
	/** 反初始化用户管理接口
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_uninit(AVDHandle usermHandle);
	/** 更新本用户信息
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] user 用户信息。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_updateUser(AVDHandle usermHandle, const AVDUser& user);
	/** 更新某一用户名
	*
	* @param[in] userId 被更改的用户Id。
	* @param[in] newUserName 新的用户名。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_updateUserName(AVDHandle usermHandle, const char* userId, const char* newUserName);
	/** 获取主持人信息
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[out] host 用户信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getHost(AVDHandle usermHandle, AVDUser& host);
	/** 获取本用户信息
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[out] self 用户信息。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getSelfUser(AVDHandle usermHandle, AVDUser& self);
	/** 获取本用户Id
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[out] *selfId 用户Id。
	* @param[out] size 用户Id字节长度。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getSelfUserId(AVDHandle usermHandle, char* selfId, uint32& size);
	/** 获取本用户应用层数据
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[out] *userData 用户数据。
	* @param[out] size 用户数据字节长度。
	* @return 返回本用户应用层数据。
	*/
	RT_API_EXPORT Result avd_usermanager_getSelfUserData(AVDHandle usermHandle, char* userData, uint32& size);
	/** 判断用户是否存在
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] selfId 用户Id。
	*
	* @return 是否存在用户。
	*/
	RT_API_EXPORT AVDBool avd_usermanager_hasUser(AVDHandle usermHandle, const char* selfId);
	/** 获取关联Id的用户信息
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] selfId 用户Id。
	* @param[out] user 用户信息。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getUser(AVDHandle usermHandle, const char* selfId, AVDUser& user);
	/** 更改本用户的应用层数据
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] userData 本用户应用层数据。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_updateSelfUserData(AVDHandle usermHandle, const char* userData);
	/** 更改本用户的用户状态
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] status 用户状态。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_updateSelfUserStatus(AVDHandle usermHandle, uint32 status);
	/** 获取房间中的用户数量
	* @param[in] usermHandle 用户管理模块句柄。
	* @return 返回本用户数量。
	*/
	RT_API_EXPORT uint32 avd_usermanager_getParticipantsCount(AVDHandle usermHandle);
	/** 根据索引获取房间中的用户信息
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] index 索引号，从0开始。
	* @param[out] item 用户信息。
	* @note 用户列表不包含本用户。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getParticipant(AVDHandle usermHandle, uint32 index, AVDUser& item);
	/** 获取房间中的用户列表
	*
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] begindex 起始索引。
	* @param[in,out] ncount 请求数量；实际返回数量。
	* @param[out] users 用户列表集合。
	* @note 用户列表不包含本用户。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getParticipants(AVDHandle usermHandle, uint32 begindex, uint32& ncount, AVDUser*& users);
	//
	/** 判断是否是自己的用户Id
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] *selfId 用户Id
	* @return 返回是否是自己。
	*/
	RT_API_EXPORT AVDBool avd_usermanager_isSelfUser(AVDHandle usermHandle, const char* selfId);
	/** 判断设备Id是否是属于自己的
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] *deviceId 设备Id
	* @return 返回设备Id是否是属于自己的。
	*/
	RT_API_EXPORT AVDBool avd_usermanager_isSelfDevice(AVDHandle usermHandle, const char* deviceId);
	/** 获取设备Id的关联用户Id
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] *deviceId 设备Id
	* @param[in] *ownerId 用户Id
	* @param[in] size 用户Id长度
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getOwnerId(AVDHandle usermHandle, const char* deviceId, char* ownerId, uint32& size);
	/** 获取设备Id的关联用户名称
	* @param[in] usermHandle 用户管理模块句柄。
	* @param[in] *deviceId 设备Id
	* @param[in] *ownerName 用户名称
	* @param[in] size 用户名称长度
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_usermanager_getOwnerName(AVDHandle usermHandle, const char* deviceId, char* ownerName, uint32& size);
}

#endif//RT_UserManager_C_H_
