#ifndef NIM_SDK_API_H_
#define NIM_SDK_API_H_

#include "export_headers/nim_client_def.h"
#include "export_headers/nim_vchat_def.h"
#include "export_headers/nim_device_def.h"


typedef bool(*nim_client_init)(const char *app_data_dir, const char *app_install_dir, const char *json_extension);
typedef void(*nim_client_cleanup)(const char *json_extension);
typedef void(*nim_client_login)(const char *app_token, const char *account, const char *password, const char *json_extension, nim_json_transport_cb_func cb, const void* user_data);
typedef void(*nim_client_relogin)(const char *json_extension);
typedef void(*nim_client_logout)(enum NIMLogoutType logout_type, const char *json_extension, nim_json_transport_cb_func cb, const void* user_data);
typedef void(*nim_client_kick_other_client)(const char *json_extension);
typedef void(*nim_client_reg_auto_relogin_cb)(const char *json_extension, nim_json_transport_cb_func cb, const void* user_data);
typedef void(*nim_client_reg_kickout_cb)(const char *json_extension, nim_json_transport_cb_func cb, const void* user_data);
typedef void(*nim_client_reg_disconnect_cb)(const char *json_extension, nim_json_transport_cb_func cb, const void* user_data);
typedef void(*nim_client_reg_multispot_login_notify_cb)(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);
typedef void(*nim_client_reg_kickout_other_client_cb)(const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);
typedef 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);
typedef 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);
typedef void(*nim_client_get_multiport_push_config)(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);
typedef const char*(*nim_tool_get_uuid)();

//云信音视频
typedef	bool(*nim_vchat_init)(const char *json_extension);
typedef	void(*nim_vchat_cleanup)(const char *json_extension);

typedef void(*nim_vchat_enum_device_devpath)(enum NIMDeviceType type, const char *json_extension, nim_vchat_enum_device_devpath_sync_cb_func cb, const void *user_data);
typedef void(*nim_vchat_start_device)(enum NIMDeviceType type, const char* device_path, unsigned fps, const char* json_extension, nim_vchat_start_device_cb_func cb, const void *user_data);
typedef void(*nim_vchat_end_device)(enum NIMDeviceType type, const char *json_extension);
typedef void(*nim_vchat_add_device_status_cb)(enum NIMDeviceType type, nim_vchat_device_status_cb_func cb, const void *user_data);
typedef void(*nim_vchat_remove_device_status_cb)(enum NIMDeviceType type);
typedef void(*nim_vchat_start_extend_camera)(const char *id, const char *device_path, unsigned fps, const char *json_extension, nim_vchat_start_device_cb_func cb, const void *user_data);
typedef void(*nim_vchat_stop_extend_camera)(const char *id, const char *json_extension);

typedef void(*nim_vchat_set_audio_data_cb)(bool capture, const char* json_extension, nim_vchat_audio_data_cb_func cb, const void *user_data);
typedef void(*nim_vchat_set_video_data_cb)(bool capture, const char* json_extension, nim_vchat_video_data_cb_func cb, const void *user_data);
typedef void(*nim_vchat_set_audio_volumn)(unsigned char volumn, bool capture);
typedef unsigned char(*nim_vchat_get_audio_volumn)(bool capture);
typedef void(*nim_vchat_set_audio_input_auto_volumn)(bool auto_volumn);
typedef bool(*nim_vchat_get_audio_input_auto_volumn)();

//设置回掉
typedef void(*nim_vchat_set_cb_func)(nim_vchat_cb_func cb, const void *user_data);
//启动通话
//json_info 见nim_vchat_def.h
typedef bool(*nim_vchat_start)(enum NIMVideoChatMode mode, const char* apns_text, const char* custom_info, const char* json_extension, const void *user_data);
//设置通话模式
typedef bool(*nim_vchat_set_talking_mode)(enum NIMVideoChatMode mode, const char* json_extension);
//回应邀请
typedef bool(*nim_vchat_callee_ack)(int64_t channel_id, bool accept, const char* json_extension, const void *user_data);
//通话控制
typedef bool(*nim_vchat_control)(int64_t channel_id, enum NIMVChatControlType type, const char* json_extension, const void *user_data);
//开始录制MP4文件，一次只允许一个录制文件，在通话开始的时候才有实际数据
typedef void(*nim_vchat_start_record)(const char *path, const char *json_extension, nim_vchat_mp4_record_opt_cb_func cb, const void *user_data);
//停止录制MP4文件
typedef void(*nim_vchat_stop_record)(const char *json_extension, nim_vchat_mp4_record_opt_cb_func cb, const void *user_data);
//结束通话
typedef void(*nim_vchat_end)(const char* json_extension);
//自定义视频数据
typedef bool(*nim_vchat_custom_video_data)(uint64_t time, const char *data, unsigned int size, unsigned int width, unsigned int height, const char *json_extension);

//自定义音频数据
typedef bool(*nim_vchat_custom_audio_data)(uint64_t time, const char* data, unsigned int size, const char* json_extension);


//NIM 通话中修改分辨率
typedef void(*nim_vchat_set_video_quality)(int video_quality, const char *json_extension, nim_vchat_opt_cb_func cb, const void* user_data);
typedef void(*nim_vchat_set_video_bitrate)(int video_bitrate, const char *json_extension, nim_vchat_opt_cb_func cb, const void* user_data);
typedef void(*nim_vchat_set_frame_rate)(enum NIMVChatVideoFrameRate frame_rate, const char* json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

//NIM 通话中修改自定义音视频数据模式
typedef void(*nim_vchat_set_custom_data)(bool custom_audio, bool custom_video, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

/** @fn void nim_vchat_set_viewer_mode(bool viewer)
* NIM VCHAT 设置观众模式（多人模式下），全局有效（重新发起时也生效），观众模式能减少运行开销
* @param[in] viewer 是否观众模式
* @return void 无返回值
*/
typedef void(*nim_vchat_set_viewer_mode)(bool viewer);

/** @fn bool nim_vchat_get_viewer_mode()
* NIM VCHAT 获取当前是否是观众模式
* @return bool true 观众模式，false 非观众模式
*/
typedef bool(*nim_vchat_get_viewer_mode)();

/** @fn void nim_vchat_set_audio_mute(bool muted)
* NIM VCHAT 设置音频静音，全局有效（重新发起时也生效）
* @param[in] muted true 静音，false 不静音
* @return void 无返回值
*/
typedef void(*nim_vchat_set_audio_mute)(bool muted);

/** @fn bool nim_vchat_audio_mute_enabled()
* NIM VCHAT 获取音频静音状态
* @return bool true 静音，false 不静音
*/
typedef bool(*nim_vchat_audio_mute_enabled)();

/** @fn void nim_vchat_set_rotate_remote_video(bool rotate)
* NIM VCHAT 设置不自动旋转对方画面，默认打开，全局有效（重新发起时也生效）
* @param[in] rotate true 自动旋转，false 不旋转
* @return void 无返回值
*/
typedef void(*nim_vchat_set_rotate_remote_video)(bool rotate);

/** @fn bool nim_vchat_rotate_remote_video_enabled()
* NIM VCHAT 获取自动旋转对方画面设置状态
* @return bool true 自动旋转，false 不旋转
*/
typedef bool(*nim_vchat_rotate_remote_video_enabled)();

/** @fn void nim_vchat_set_member_in_blacklist(const char *uid, bool add, bool audio, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
* NIM VCHAT 设置单个成员的黑名单状态，当前通话有效(只能设置进入过房间的成员)
* @param[in] uid 成员account
* @param[in] add true表示添加到黑名单，false表示从黑名单移除
* @param[in] audio true表示音频黑名单，false表示视频黑名单
* @param[in] json_extension 无效扩展字段
* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
* @return void 无返回值
*/
typedef void(*nim_vchat_set_member_in_blacklist)(const char *uid, bool add, bool audio, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);

/** @fn void nim_vchat_create_room(const char *room_name, const char *custom_info, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
* NIM VCHAT 创建一个多人房间（后续需要主动调用加入接口进入房间）
* @param[in] room_name 房间名
* @param[in] custom_info 自定义的房间信息（加入房间的时候会返回）
* @param[in] json_extension 无效扩展字段
* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
* @return void 无返回值
*/
typedef void(*nim_vchat_create_room)(const char *room_name, const char *custom_info, const char *json_extension, nim_vchat_opt2_cb_func cb, const void *user_data);

/** @fn bool nim_vchat_join_room(const char *room_name, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
* NIM VCHAT 加入一个多人房间（进入房间后成员变化等，等同点对点nim_vchat_cb_func）
* @param[in] mode NIMVideoChatMode 音视频通话类型 见nim_vchat_def.h
* @param[in] room_name 房间名
* @param[in] json_extension 可选 如{"custom_video":0, "custom_audio":0, "video_quality":0, "session_id":"1231sda"}
* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension扩展字段中包含 kNIMVChatCustomInfo,kNIMVChatSessionId
* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
* @return bool true 调用成功，false 调用失败可能有正在进行的通话
*/
typedef bool(*nim_vchat_join_room)(enum NIMVideoChatMode mode, const char *room_name, const char *json_extension, nim_vchat_opt2_cb_func cb, const void *user_data);

/** @fn void nim_vchat_update_rtmp_url(const char *rtmp_url, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data)
* NIM 通话中修改直播推流地址（主播有效）
* @param[in] rtmp_url 新的rtmp推流地址
* @param[in] json_extension 无效扩展字段
* @param[in] cb 结果回调见nim_vchat_def.h，返回的json_extension无效
* @param[in] user_data APP的自定义用户数据，SDK只负责传回给回调函数cb，不做任何处理！
* @return void 无返回值
*/
typedef void(*nim_vchat_update_rtmp_url)(const char *rtmp_url, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);
typedef void(*nim_vchat_set_streaming_mode)(bool streaming, const char* json_info, nim_vchat_opt_cb_func cb, const void *user_data);

typedef void(*nim_vchat_set_audio_volumn)(unsigned char volumn, bool capture);
typedef unsigned char(*nim_vchat_get_audio_volumn)(bool capture);

typedef void(*nim_vchat_set_custom_data)(bool custom_audio, bool custom_video, const char *json_extension, nim_vchat_opt_cb_func cb, const void *user_data);
#endif
