/** @file nim_client.h
  * @brief SDK接入 接口头文件，主要包括SDK初始化/清理、客户端登录/退出/重连/掉线/被踢等流程
  * NIM SDK所有接口命名说明: nim_***(模块)_***(功能)，如nim_client_init
  * NIM SDK所有接口参数说明: 所有与字符串相关的参数(char *)全部为UTF-8编码。
  * @copyright (c) 2015-2017, NetEase Inc. All rights reserved
  * @author Harrison
  * @date 2015/2/1
  */

#ifndef NIM_SDK_DLL_API_NIM_CLIENT_H_
#define NIM_SDK_DLL_API_NIM_CLIENT_H_

#include "nim_sdk_dll.h"
#include "../export_headers/nim_client_def.h"
#include "../util/stdbool.h"

#ifdef __cplusplus
extern"C"
{
#endif
/** @fn bool nim_client_init(const char *app_data_dir, const char *app_install_dir, const char *json_extension)    
  * NIM SDK初始化，传入的JSON参数定义见nim_client_def.h    
  * @param[in] app_data_dir 使用默认路径时只需传入单个目录名（不以反斜杠结尾)，使用自定义路径时需传入完整路径（以反斜杠结尾，并确保有正确的读写权限！）
  * @param[in] app_install_dir 目前不需要传入（SDK可以自动获取）
  * @param[in] json_extension json扩展参数。目前可以用于支持一些全局配置（必填，如APP_KEY、数据库的加密密钥等）和私有服务器的设置（选填）
  * @return bool 返回值true: 成功， false: 失败
  */ 
NIM_SDK_DLL_API	bool nim_client_init(const char *app_data_dir, const char *app_install_dir, const char *json_extension);

/** @fn void nim_client_cleanup(const char *json_extension)   
  * NIM SDK清理，传入的JSON参数定义见nim_client_def.h    
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @return void 无返回值
  */
NIM_SDK_DLL_API	void nim_client_cleanup(const char *json_extension);

/** @fn void nim_client_update_apns_token(const char *device_token)   
  * (PC SDK该接口无效)更新Device Token，iOS推送使用    
  * @param[in] device_token device token
  * @return void 无返回值
  */
NIM_SDK_DLL_API	void nim_client_update_apns_token(const char *device_token);

/** @fn void nim_client_login(const char *app_key, const char *account, const char *token, const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * NIM客户端登录，传入的JSON参数定义见nim_client_def.h    
  * @param[in] app_key APP key
  * @param[in] account APP account
  * @param[in] token 令牌 (在后台绑定的登录token)
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 登录流程的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				302:账号或密码错误
  *				403:禁止操作
  *				408:请求超时
  *				414:参数错误
  *				415:网络连接出现错误
  *				416:频率超限
  *				422:账号被禁用
  */
NIM_SDK_DLL_API	void nim_client_login(const char *app_key, const char *account, const char *token, const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn int nim_client_get_login_state(const char *json_extension)
  * 获取NIM客户端登录状态
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @return int 登录状态
  */
NIM_SDK_DLL_API int nim_client_get_login_state(const char *json_extension);

/** @fn void nim_client_relogin(const char *json_extension)
  * NIM客户端手动重连（注意 APP需要统一处理自动重连/手动重连的回调，因为如果处于某次自动重连的过程中调用手动重连接口，不起作用！）   
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @return void 无返回值
  */
NIM_SDK_DLL_API	void nim_client_relogin(const char *json_extension);

/** @fn void nim_client_logout(enum NIMLogoutType logout_type, const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * NIM客户端注销/退出，传入的JSON参数定义见nim_client_def.h 
  * @param[in] logout_type Logout操作类型，其定义见nim_client_def.h
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 注销/退出的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				500:未知错误
  */
NIM_SDK_DLL_API	void nim_client_logout(enum NIMLogoutType logout_type, const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn void nim_client_kick_other_client(const char *json_extension)
  * 将本帐号的其他端踢下线
  * @param[in] json_extension 设备标识，其定义见nim_client_def.h
  * @return void 无返回值 通过注册nim_client_reg_kickout_other_client_cb回调得到结果
  */
NIM_SDK_DLL_API void nim_client_kick_other_client(const char *json_extension);

/** @fn void nim_client_reg_auto_relogin_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * (全局回调)注册NIM客户端自动重连回调。重连失败时，如果不是网络错误引起的（网络相关的错误号为kNIMResTimeoutError和kNIMResConnectionError），而是服务器返回了非kNIMResSuccess的错误号，
  * 则说明重连的机制已经失效，需要APP层调用nim_client_logout执行注销操作并退回到登录界面后进行重新登录。
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 自动重连的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h。
  *				  如果返回错误号kNIMResExist，说明无法继续重连，App层必须调用nim_client_logout退出到登录界面，以便用户重新进行登录。
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  *				403:禁止操作
  *				408:请求超时
  *				414:参数错误
  *				415:网络连接出现错误
  *				416:频率超限
  *				422:账号被禁用
  */
NIM_SDK_DLL_API	void nim_client_reg_auto_relogin_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn void nim_client_reg_kickout_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * (全局回调)注册NIM客户端被踢回调
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 被踢的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  */
NIM_SDK_DLL_API void nim_client_reg_kickout_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn nim_client_reg_disconnect_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * (全局回调)注册NIM客户端掉线回调
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 掉线的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  */
NIM_SDK_DLL_API void nim_client_reg_disconnect_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn void nim_client_reg_multispot_login_notify_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * (全局回调)注册NIM客户端多点登录通知回调
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 多点登录通知的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  */
NIM_SDK_DLL_API void nim_client_reg_multispot_login_notify_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn void nim_client_reg_kickout_other_client_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data)
  * (全局回调)注册NIM客户端将本帐号的其他端踢下线结果回调
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 操作结果的回调函数， nim_json_transport_cb_func回调函数定义见nim_global_def.h
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  * @note 错误码	200:成功
  */
NIM_SDK_DLL_API void nim_client_reg_kickout_other_client_cb(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);

/** @fn void nim_client_reg_sync_multiport_push_config_cb(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);
  * (全局回调)注册多端推送设置同步回调
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值
  */
NIM_SDK_DLL_API void nim_client_reg_sync_multiport_push_config_cb(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);

/** @fn nim_client_set_multiport_push_config(const char *switch_content, const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);
  * 设置多端推送控制开关
  * @param[in] switch_content 开关内容
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 操作结果的回调函数
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值 通过注册nim_client_reg_kickout_other_client_cb回调得到结果
  * @note 错误码	200:成功
  */
NIM_SDK_DLL_API void nim_client_set_multiport_push_config(const char *switch_content, const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);

/** @fn nim_client_get_multiport_push_config(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);
  * 获取多端推送控制开关
  * @param[in] json_extension json扩展参数（备用，目前不需要）
  * @param[in] cb 操作结果的回调函数
  * @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
  * @return void 无返回值 通过注册nim_client_reg_kickout_other_client_cb回调得到结果
  */
NIM_SDK_DLL_API void nim_client_get_multiport_push_config(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);

#if !NIMAPI_UNDER_WIN_DESKTOP_ONLY
/** @fn nim_client_set_dnd_config(const char* cfg_json, const char *json_extension, nim_client_dnd_cb_func cb, const void *user_data);
* (PC SDK该接口无效)ios 免打扰设置
* @param[in] cfg_json 免打扰设置
* @param[in] json_extension json扩展参数（备用，目前不需要）
* @param[in] cb 操作结果的回调函数
* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
* @return void 无返回值 通过注册nim_client_reg_kickout_other_client_cb回调得到结果
*/
NIM_SDK_DLL_API void nim_client_set_dnd_config(const char* cfg_json, const char *json_extension, nim_client_dnd_cb_func cb, const void *user_data);

/** @fn nim_client_get_dnd_config(nim_client_dnd_cb_func cb, const void *user_data);
* (PC SDK该接口无效)获取ios 免打扰设置
* @param[in] cb 操作结果的回调函数
* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
* @return void 无返回值 通过注册nim_client_reg_kickout_other_client_cb回调得到结果
*/
NIM_SDK_DLL_API void nim_client_get_dnd_config(nim_client_dnd_cb_func cb, const void *user_data);

/** @fn const char * nim_tool_get_version()
* (PC SDK该接口无效)获取SDK 版本号
* @return const char * SDK 版本号
*/
NIM_SDK_DLL_API const char* nim_client_get_version();

#endif

#ifdef __cplusplus
};
#endif //__cplusplus
#endif //NIM_SDK_DLL_API_NIM_CLIENT_H_