#ifndef RT_Chat_C_H_
#define RT_Chat_C_H_

#include "common_c.h"

/**
* 聊天消息结构.
*
* 聊天消息定义了一次传输聊天的信息。
*/
struct AVDMessage {
	uint32	timestamp;								/**< 消息时间戳，对应用层是本地时间，传输中用GMT时间 */
	char	fromId[Max_UserId];						/**< 消息发送者Id */
	char	fromName[Max_UserName];					/**< 消息发送者名 */
	char	message[4*Max_Message];					/**< 消息内容 */
	AVDMessage() :timestamp(0) {
		memset(fromId, 0, sizeof(fromId));
		memset(fromName, 0, sizeof(fromName));
		memset(message, 0, sizeof(message));
	}
	void clear(){
		memset(this, 0, sizeof(AVDMessage));
	}
};

/**
* 房间中聊天模块回调接口.
*
* 聊天模块回调接口定义了房间中聊天相关的通知。
*/
typedef struct Chat_Callback {
	/// 通知
	/** 接收到公聊消息通知
	*
	* @param[in] chatHandle 聊天模块句柄。
	* @param[in] message 消息内容。
	* @note 当用户发送公聊消息后，房间内所有用户除发送者外都将接收到此通知。
	* @sa AVDMessage
	* @sa avd_chat_sendPublicMessage
	*/
	void(*chat_onPublicMessage) (AVDHandle chatHandle, const AVDMessage& message);
	/** 接收到私聊消息通知
	*
	* @param[in] chatHandle 聊天模块句柄。
	* @param[in] message 消息内容。
	* @note 当用户发送私聊消息后，只有消息目的用户接收到此消息通知。
	* @sa AVDMessage
	* @sa avd_chat_sendPrivateMessage
	*/
	void(*chat_onPrivateMessage)(AVDHandle chatHandle, const AVDMessage& message);
	Chat_Callback() {
		chat_onPublicMessage = NULL;
		chat_onPublicMessage = NULL;
	}
}*LPChat_Callback;

///
extern "C" {
	/** 初始化聊天模块接口
	*
	* @param[in] roomHandle 房间句柄。
	* @param[in] cb 聊天模块回调接口指针。
	* @param[out] chatHandle 聊天模块句柄。
	* @return 返回错误代码。
	* @sa Chat_Callback
	*/
	RT_API_EXPORT Result avd_chat_init(AVDHandle roomHandle, LPChat_Callback cb, AVDHandle& chatHandle);
	/** 反初始化聊天模块接口
	*
	* @param[out] chatHandle 聊天模块句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_chat_uninit(AVDHandle chatHandle);
	/** 发送公聊消息
	*
	* @param[out] chatHandle 聊天模块句柄。
	* @param[in] *msg 消息内容。
	* @param[in] len 消息内容长度。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_chat_sendPublicMessage(AVDHandle chatHandle, const char* msg, uint32 len);
	/** 发送私聊消息
	*
	* @param[out] chatHandle 聊天模块句柄。
	* @param[in] *msg 消息内容。
	* @param[in] len 消息内容长度。
	* @param[in] *toUserId 私聊消息目的用户Id。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_chat_sendPrivateMessage(AVDHandle chatHandle, const char* msg, uint32 len, const char* toUserId);
	//
	/** 获取公聊历史消息记录
	*
	* @param[out] chatHandle 聊天模块句柄。
	* @param[in] latest 是否是最新记录（即反序）。
	* @param[in] begindex 消息起始索引。
	* @param[in,out] ncount 请求消息数量；实际消息返回数量。
	* @param[out] *&messages 保存消息列表。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_chat_getPublicHistoryMessage(AVDHandle chatHandle, AVDBool latest, uint32 begindex, uint32& ncount, AVDMessage*& messages);
	/** 获取私聊历史消息记录
	*
	* @param[out] chatHandle 聊天模块句柄。
	* @param[in] *userId 聊天对方的用户Id。
	* @param[in] latest 是否是最新记录（即反序）。
	* @param[in] begindex 消息起始索引。
	* @param[in,out] ncount 请求消息数量；实际消息返回数量。
	* @param[out] *&messages 保存消息列表。
	*
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_chat_getPrivateHistoryMessage(AVDHandle chatHandle, const char* userId, AVDBool latest, uint32 begindex, uint32& ncount, AVDMessage*& messages);
}

#endif//RT_Chat_C_H_
