/** @file nim_sysmsg.h
  * @brief 系统（自定义）消息 接口头文件
  * @copyright (c) 2015-2017, NetEase Inc. All rights reserved
  * @author Oleg
  * @date 2015/2/1
  */

#ifndef NIM_SDK_DLL_API_NIM_SYSMSG_H_
#define NIM_SDK_DLL_API_NIM_SYSMSG_H_

#include "nim_sdk_dll.h"
#include "../export_headers/nim_sysmsg_def.h"

#ifdef __cplusplus
extern"C"
{
#endif
/** @fn void nim_sysmsg_reg_sysmsg_cb(const char *json_extension, nim_sysmsg_receive_cb_func cb, const void *user_data)
  * (全局回调)注册接收系统通知回调接口
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			操作结果的回调函数， nim_sysmsg_receive_cb_func回调函数定义见nim_sysmsg_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  */
NIM_SDK_DLL_API void nim_sysmsg_reg_sysmsg_cb(const char *json_extension, nim_sysmsg_receive_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_send_custom_notification(const char *json_msg, const char *json_extension)
  * 发送自定义通知
  * @param[in] json_msg		消息体Json string (Keys SEE MORE `nim_sysmsg_def.h` 『系统消息结构 Json Keys』)
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @return void 无返回值
  */
NIM_SDK_DLL_API void nim_sysmsg_send_custom_notification(const char *json_msg, const char *json_extension);

/** @fn void nim_sysmsg_reg_custom_notification_ack_cb(const char *json_extension, nim_custom_sysmsg_ack_cb_func cb, const void *user_data)
  * (全局回调)发送自定义通知结果回调函数 （必须全局注册，统一接受回调后分发消息到具体的会话。注意：客户端发包之后，服务器不一定会返回！）
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb		发送透传消息的回调函数, nim_custom_sysmsg_ack_cb_func回调函数定义见nim_sysmsg_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  */
NIM_SDK_DLL_API void nim_sysmsg_reg_custom_notification_ack_cb(const char *json_extension, nim_custom_sysmsg_ack_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_query_msg_async(int limit_count, int64_t last_time, const char *json_extension, nim_sysmsg_query_cb_func cb, const void *user_data)
  * 查询本地系统消息（按时间逆序起查，逆序排列）
  * @param[in] limit_count	一次查询数量，建议20
  * @param[in] last_time	上次查询最后一条消息的时间戳（按时间逆序起查，即最小的时间戳）
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			查询本地系统消息的回调函数， nim_sysmsg_query_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  */
NIM_SDK_DLL_API void nim_sysmsg_query_msg_async(int limit_count, int64_t last_time, const char *json_extension, nim_sysmsg_query_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_query_unread_count(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data)
  * 查询未读消息数
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			查询未读消息数的回调函数， nim_sysmsg_res_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  */
NIM_SDK_DLL_API void nim_sysmsg_query_unread_count(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_set_status_async(int64_t msg_id, enum NIMSysMsgStatus status, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data)
  * 设置消息状态
  * @param[in] msg_id		消息id
  * @param[in] status		消息状态
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			设置消息状态的回调函数， nim_sysmsg_res_ex_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				0:失败
  */
NIM_SDK_DLL_API void nim_sysmsg_set_status_async(int64_t msg_id, enum NIMSysMsgStatus status, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_read_all_async(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data)
  * 设置全部消息为已读
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			设置全部消息为已读的回调函数， nim_sysmsg_res_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				0:失败
  */
NIM_SDK_DLL_API void nim_sysmsg_read_all_async(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_delete_async(int64_t msg_id, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data)
  * 删除消息
  * @param[in] msg_id		消息id
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			删除消息的回调函数， nim_sysmsg_res_ex_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				0:失败
  */
NIM_SDK_DLL_API void nim_sysmsg_delete_async(int64_t msg_id, const char *json_extension, nim_sysmsg_res_ex_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_delete_all_async(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data)
  * 全部删除
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			删除消息的回调函数， nim_sysmsg_res_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				0:失败
  */
NIM_SDK_DLL_API void nim_sysmsg_delete_all_async(const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_set_logs_status_by_type_async(enum NIMSysMsgType type, enum NIMSysMsgStatus status, const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data)
  * 按消息类型批量设置消息状态
  * @param[in] type 消息类型
  * @param[in] status 消息状态,见NIMSysMsgStatus
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			回调函数， nim_sysmsg_res_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				0:失败
  */
NIM_SDK_DLL_API void nim_sysmsg_set_logs_status_by_type_async(enum NIMSysMsgType type, enum NIMSysMsgStatus status, const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

/** @fn void nim_sysmsg_delete_logs_by_type_async(enum NIMSysMsgType type, const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data)
  * 按消息类型批量删除消息
  * @param[in] type 消息类型
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb			回调函数， nim_sysmsg_res_cb_func回调函数定义见nim_msglog_def.h
  * @param[in] user_data	APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				0:失败
  */
NIM_SDK_DLL_API void nim_sysmsg_delete_logs_by_type_async(enum NIMSysMsgType type, const char *json_extension, nim_sysmsg_res_cb_func cb, const void *user_data);

#ifdef __cplusplus 
};
#endif //__cplusplus
#endif //NIM_SDK_DLL_API_NIM_SYSMSG_H_