#ifndef RT_AVDRecord_C_H_
#define RT_AVDRecord_C_H_

#include "common_c.h"

/**
* 录制数据结构.
*
* 录制数据定义了一个录制的基本信息。
*/
struct AVDRecordInfo {
	char id[Max_DeviceId];			/**< 录制ID */
	char name[Max_DeviceName];		/**< 录制的名称 */
	char description[Max_DeviceDescription]; /**< 录制描述 */
	char tags[Max_DeviceDescription];		 /**< 录制标记 */
	char userId[Max_UserId];		/**< 用户号，可不存在，存在时与audioType，videoType一起使用；录制此用户的相关音频和视频数据 */
	rtc::MediaFileType   fileType;		/**< 媒体文件类型 */
	rtc::RecordAudioType audioType;		/**< 音频类型 */
	rtc::RecordVideoType videoType;		/**< 视频类型 */
	uint64 size;					/**< 录制文件大小 */
	char createTime[Max_TimeLen];	/**< 录制创建起始时间 */
	uint64 duration;				/**< 录制从创建到现在的时长 */
	rtc::RecordStatus status;			/**< 录制状态 */
	char roomId[Max_RoomId];		/**< 频道关联房间号 */
	char  url[Max_UrlLen];			/**< 播放录制链接,单个文件时 */
	char** urls;					/**< 播放录制链接列表,当录制是多个文件时,如录制mp4视频分辨率变化会产生多个文件; 每项长度为Max_UrlLen */
	uint32 urls_size;				/**< urls的数量 */
public:
	AVDRecordInfo() :fileType(rtc::mt_mp4), audioType(rtc::ra_user_single), videoType(rtc::rv_main), size(0), duration(0), status(rtc::rs_created){
		memset(id, 0, sizeof(id));
		memset(name, 0, sizeof(name));
		memset(description, 0, sizeof(description));
		memset(tags, 0, sizeof(tags));
		memset(userId, 0, sizeof(userId));
		memset(url, 0, sizeof(url));
		memset(createTime, 0, sizeof(createTime));
		memset(roomId, 0, sizeof(roomId));
		urls = NULL;
		urls_size = 0;
	}
	~AVDRecordInfo() {
		clearUrls();
	}
	bool isValid() const { return id[0] != 0; }
	void clearUrls(){
		if (NULL == urls || 0 == urls_size) {
			return;
		}
		for (uint32 i = 0; i < urls_size; ++i) {
			delete[] urls[i];
		}
		delete[] urls;
		urls = NULL;
		urls_size = 0;
	}
};
typedef AVDRecordInfo* LPAVDRecordInfo;

/**
* 旁路录制回调接口类
*
* 旁路录制回调接口定义了录制管理操作的异步返回。
*/
typedef struct AVDRecord_Callback {
	///
	/** 创建录制的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] info 录制信息。
	*
	* @sa createRecord
	*/
	void(*onCreateRecord) (uint32 callId, Result result, const AVDRecordInfo& info);
	/** 为特定录制设置当前视频源的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] recordId 录制号。
	* @param[in] selectedVideo_deviceId 已发布的视频Id。
	*
	* @sa selectVideo4Record
	*/
	void(*onSelectMedia4Record) (uint32 callId, Result result, const char* recordId, const char* selectedVideo_deviceId);
	/** 创建特定用户录制的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] info 录制信息。
	*
	* @sa createUserRecord
	*/
	void(*onCreateUserRecord) (uint32 callId, Result result, const AVDRecordInfo& info);
	/** 停止特定录制的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] recordId 录制号。
	*
	* @sa stopRecord
	*/
	void(*onStopRecord) (uint32 callId, Result result, const char* recordId);

	///
	/** 获取特定录制详细信息的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] info 录制信息。
	*
	* @sa getRecordInfo
	*/
	void(*onRecordInfo) (uint32 callId, Result result, const AVDRecordInfo& info);
	/** 获取服务器上录制列表的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] total  总共直播数。
	* @param[in] begin  当前起始序号。
	* @param[in] items 录制信息集合。
	*
	* @sa getWorkingRecords
	*/
	void(*onRecordInfos) (uint32 callId, Result result, uint32 total, uint32 begin, const LPAVDRecordInfo& items, uint32 numOfItem);
	/** 删除特定录制的异步返回
	*
	* @param[in] callId 调用Id。
	* @param[in] result 错误代码。
	* @param[in] recordId 录制号。
	*
	* @sa deleteRecord
	*/
	void(*onDeleteRecord) (uint32 callId, Result result, const char* recordId);

	AVDRecord_Callback() {
		onCreateRecord = NULL;
		onSelectMedia4Record = NULL;
		onCreateUserRecord = NULL;
		onStopRecord = NULL;
		onRecordInfo = NULL;
		onRecordInfos = NULL;
		onDeleteRecord = NULL;
	}
}*LPAVDRecord_Callback;

/**
* 旁路录制管理接口.
*
* 旁路录制管理定义引擎中录制的创建、删除、信息获取和录制控制等功能，该录制成功后文件存储在RecorderServer上，而不是本地。
*/
///
extern "C" {
	/** 初始化旁路录制功能接口
	*
	* @param[in] cb 旁路录制回调指针。
	* @note 初始化旁路录制前必须已经完成了AVD引擎的初始化工作。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_record_init(LPAVDRecord_Callback cb);
	/** 反初始化旁路录制
	*
	* @note 旁路录制反初始化后，旁路录制相关接口都无效。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_record_uninit();

	//
	/** 创建一个录制
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in]  info 中roomId，name必须设置；创建成功时id会设置成新创建的录制Id，在异步返回中返回。
	* @note 暂时未实现； 为异步操作，操作结果在 onCreateRecord 中返回。
	* @sa onCreateRecord
	*/
	RT_API_EXPORT Result avd_record_createRecord(uint32& callId, const AVDRecordInfo& info);
	/** 为特定录制设置当前视频源
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in] recordId 录制号。
	* @param[in] roomId 视频相关房间号。
	* @param[in] selectedVideo_deviceId 已发布的视频Id。
	* @return 暂时未实现； 返回错误代码。
	* @note 为异步操作，操作结果在 onSelectMedia4Record 中返回。
	* @sa onSelectMedia4Record
	*/
	RT_API_EXPORT Result avd_record_selectMedia4Record(uint32& callId, const char* recordId, const char* roomId, const char* selectedVideo_deviceId);
	/** 创建特定用户录制
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in]  info 中roomId，name, userid, fileType必须设置；创建成功时id会设置成新创建的录制Id，在异步返回中返回。
	* @return 返回错误代码。
	* @note 参数结构中的音频类型缺省为：ra_user_single
	视频类型缺省为：rv_main
	*		为异步操作，操作结果在 onCreateUserRecord 中返回。
	* @sa onCreateUserRecord
	*/
	RT_API_EXPORT Result avd_record_createUserRecord(uint32& callId, const AVDRecordInfo& info);
	/** 停止特定录制
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in]  recordId 录制号。
	* @return 返回错误代码。
	* @note 为异步操作，操作结果在 onStopRecord 中返回。
	* @sa onStopRecord
	*/
	RT_API_EXPORT Result avd_record_stopRecord(uint32& callId, const char* recordId);

	/** 获取特定录制详细信息
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in]  recordId 录制号。
	* @return 返回错误代码。
	* @note 为异步操作，操作结果在 onRecordInfo 中返回。
	* @sa onRecordInfo
	*/
	RT_API_EXPORT Result avd_record_getRecordInfo(uint32& callId, const char* recordId);
	/** 获取服务器上的录制列表
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in]  begindex 分页的起始索引。
	* @param[in]  ncount 分页的请求数量。
	* @param[in]  filter 查询条件，以json表示，如：{ "roomId":"hafds2324" }。
	* @return 返回错误代码。
	* @note 为异步操作，操作结果在 onRecordInfos 中返回。
	* @sa onRecordInfos
	*/
	RT_API_EXPORT Result avd_record_findRecordInfos(uint32& callId, uint32 begindex, uint32 ncount, const char* filter);
	/** 删除特定录制
	*
	* @param[in,out] callId 调用Id，用于区别多次调用，在回调中会带上此调用Id，便于应用层区别每次调用；若调用时为0，内部产生一个序号。
	* @param[in]  recordId 录制号。
	* @return 返回错误代码。
	* @note 为异步操作，操作结果在 onDeleteRecord 中返回。
	* @sa onDeleteRecord
	*/
	RT_API_EXPORT Result avd_record_deleteRecord(uint32& callId, const char* recordId);

}

#endif//RT_AVDRecord_C_H_
