#ifndef XYSDK_HTTP_API_H
#define XYSDK_HTTP_API_H


#ifdef XY_HTTP_API_TEST
#define XIMALAYA_BASE_URL "http://m.test.ximalaya.com"
#else
#define XIMALAYA_BASE_URL "http://api.ximalaya.com"
#endif


#define XY_HTTP_TEMP_TOKEN_INTERFACE			    "/ximalayaos-openapi-xm/oauth2/secure_access_token"
#define XY_HTTP_REFRESH_TOKEN_INTERFACE			    "/ximalayaos-openapi-xm/oauth2/refresh_token"
#define XY_HTTP_PLAY_URL_INTERFACE					"/ximalayaos-openapi-xm/bff/open/get_play_info"
#define XY_HTTP_QRCODE_INTERFACE					"/elderly-ximalayaos-login-api/api/login_pay_qrcode/create_qrcode"
#define XY_HTTP_QRCODE_CHECK_INTERFACE				"/elderly-ximalayaos-login-api/api/login_pay_qrcode/get_qrcode_status"
#define XY_HTTP_USER_LOGOUT_INTERFACE				"/elderly-ximalayaos-login-api/api/distributed_login_info/logout"
#define XY_HTTP_USER_VIP_INFO_INTERFACE				"/ximalayaos-openapi-xm/profile/user_info"
#define XY_HTTP_USER_SUBSCRIBE_LIST_INTERFACE		"/ximalayaos-openapi-xm/small/v2/subscribe/get_albums_by_uid"
#define XY_HTTP_SUBSCRIBE_CTRL_INTERFACE		    "/ximalayaos-openapi-xm/subscribe/add_or_delete"
#define XY_HTTP_ALBUM_IS_SUBCRIBE_INTERFACE	        "/ximalayaos-openapi-xm/v2/subscribe/is_subscribed"
#define XY_HTTP_USER_HISTORY_LIST_INTERFACE	        "/ximalayaos-openapi-xm/small/play_history/get_by_uid"
#define XY_HTTP_USER_BOUGHT_LIST_INTERFACE	        "/ximalayaos-openapi-xm/small/v2/open_pay/get_bought_albums"
#define XY_HTTP_ALBUM_IS_BOUGHT_INTERFACE	        "/ximalayaos-openapi-xm/open_pay/album_bought_status"
#define XY_HTTP_TRACK_IS_BOUGHT_INTERFACE	        "/ximalayaos-openapi-xm/open_pay/track_bought_status"
#define XY_HTTP_USER_HISTORY_UPLOAD_INTERFACE	    "/ximalayaos-openapi-xm/play_history/batch_upload"
#define XY_HTTP_PLAY_RECORD_UPLOAD_INTERFACE	    "/ximalayaos-openapi-xm/openapi-collector-app/track_batch_records"
#define XY_HTTP_LISTEN_LIST_INTERFACE               "/xmly-iot-api/content/listen/get"
#define XY_HTTP_TRACK_LIST_BY_ALBUMID_INTERFACE     "/xmly-iot-api/content/album/query"
#define XY_HTTP_TRACK_LIST_BY_TRACKID_INTERFACE     "/xmly-iot-api/content/track/query"
#define XY_HTTP_HOMEPAGE_INFO_INTERFACE             "/xmly-iot-api/content/template/get"
#define XY_HTTP_POPUP_SCREEN_INFO_INTERFACE         "/xmly-iot-market/api/popup_screen/info"

//播放url接口请求参数结构体
typedef struct { 
    char track_id[XY_MAX_ID_LEN];       //音频id
    char album_id[XY_MAX_ID_LEN];       //专辑id,当pay_type为1时需要该字段判断是否购买 
    uint8_t source_type;                // 1：大喜马  2：小喜马。未获取到默认传1
    uint8_t pay_type;                   //音频付费类型，0：免费  1：付费  2：试听
    uint8_t album_type;                 //专辑类型 0:免费专辑 1：精品单购， 2：vip专享， 3：vip畅听,当pay_type为1时需要该字段判断是否购买             
} xy_get_url_req_model;

//播放url接口响应参数结构体
typedef struct {
    char url[XY_MAX_PLAY_URL_LEN];   //播放url
    uint16_t play_duration;          //音频时长,单位s
    uint32_t play_size;              //音频文件大小
} xy_get_url_resp_model;


//设备信息结构体
typedef struct { 
    char device_name[XY_MAX_STR_LEN_64];   //设备名称
    char device_model[XY_MAX_STR_LEN_32];   //设备型号
} xy_device_info;

//支付信息结构体
typedef struct { 
    
    uint8_t album_type;                         //专辑类型 1：精品单购， 2：vip专享， 3：vip畅听
    uint8_t distribute_type;                    //分销商品类型 1：单购声音（暂不考虑）  2：单购专辑  3：购买会员 
    char pay_content[XY_MAX_ID_LEN];            //单购专辑时传专辑id, 购买会员时传itemID（需要获取sku，设备不展示sku时传专辑id）
    char album_id[XY_MAX_ID_LEN];               //专辑id
} xy_pay_info;

//获取二维码请求参数结构体
typedef struct { 
    char action[XY_MAX_STR_LEN_16];   //登录传login, 支付传buy, 购买vip传personal_center
    xy_device_info device_info;                // 设备信息
    xy_pay_info pay_info;                   //支付信息，action为buy时必传
} xy_get_qrcode_req_model;

//获取二维码响应参数结构体
typedef struct {
    char qrcode_url[XY_MAX_URL_LEN];   //二维码url
    char qrcode_id[XY_MAX_TOKEN_LEN];      //二维码id
    char qrcode_title[XY_MAX_STR_LEN_64];    ///二维码标题，显示在二维码上方
    char qrcode_text[XY_MAX_STR_LEN_128];    ///二维码描述，显示在二维码下方
} xy_get_qrcode_resp_model;

//返回登录支付状态结构体
typedef struct { 
    char status_text[XY_MAX_STR_LEN_32];      //扫码状态描述
    uint8_t status;                 //当前扫码状态 0：未扫码 1：扫码中
    uint8_t pay_status;             //支付二维码返回支付状态 0：未支付 1：支付成功 2：已购买；非支付二维码不处理
    uint8_t login_status;             //返回登录状态 0：未登录 1：登录成功 2：已登录
} xy_qrcode_status_resp_model;


//获取用户订阅列表请求参数结构体
//timeline 字段不是13位时间戳。获取内容时timeline字段需先用0请求，从接口返回JSON中读取最后一个timeline的值来获取之前的内容。
//limit需要和接收数据的数组成员个数保持一致，默认使用XY_ALBUM_NUM_PER_PAGE传入
typedef struct { 
    char timeline[XY_MAX_STR_LEN_16];  //表示获取timeline更新时间点之前更新的limit条订阅专辑；（为 0 表示从当前时间点最新更新的第一条订阅专辑开始获取）
    uint16_t page;                 //分页请求页码，从1开始
    uint8_t limit;                 //拉取 timeline 时间点之前更新的订阅专辑数目，默认20，最多不超过 20，
    bool contains_paid;             //是否输出付费内容：true- 是；false-否；默认不填为 false
} xy_get_subscribe_req_model;


//收听历史请求参数结构体
typedef struct { 
    uint16_t page;                 //分页请求页码，从1开始
    uint8_t limit;                 //每页大小，返回[1,20]，默认使用XY_ALBUM_NUM_PER_PAGE传入
    bool contains_paid;             //是否输出付费内容：true- 是；false-否；默认不填为 false
} xy_get_history_req_model;

//收听历史请求参数结构体
typedef struct { 
    uint16_t page;                 //分页请求页码，从1开始
    uint8_t limit;                 //每页大小，返回[1,20]，默认使用XY_ALBUM_NUM_PER_PAGE传入
    bool exclude_not_permission;             //该数值为true时，将会过滤列表中没有权益的专辑  默认不填为false
} xy_get_bought_req_model;

//播放数据结构体
typedef struct
{
    uint16_t played_duration;                           //本次播放的时长，相对于开始播放位置的一个值,单位s
    uint16_t break_secs;                        //断点时间，相对于音频开始位置0的一个值,单位s
    uint32_t business_type;                         //1-助眠解压 2-场景一键听 其余不需要传
    uint32_t channel_id;                       // 当 business_type=2 时必传，表示频道 id，其余不需要传
    uint32_t scene_id;                         //场景 ID，business_type=2 时(场景一键听)传，其余时候不传
    uint32_t topic_id;                      //主题 ID，business_type=1 时(助眠解压)传，其余时候不传
    char started_at[XY_MAX_STR_LEN_16];     //音频开始播放时间戳，单位ms
    char end_at[XY_MAX_STR_LEN_16];         //音频结束播放时间戳，单位ms
    char track_id[XY_MAX_ID_LEN];           //音频id
    char album_id[XY_MAX_ID_LEN];           //专辑id
}xy_played_info_t;

//上报播放数据请求参数结构体
typedef struct
{
    uint8_t count;                           //上报的记录个数， 数据拼接在url中，尽量及时上报
    xy_played_info_t play_array[XY_PLAY_DATA_UPLOAD_NUM_MAX];      //播放记录数组，默认XY_PLAY_DATA_UPLOAD_NUM_MAX
}xy_play_info_upload_model;

//声音列表信息
typedef struct{
	uint8_t source_type;                // 1：大喜马  2：小喜马。未获取到默认传1
    uint8_t pay_type;                   //支付类型 (专辑：0=免费,1=vip,2=精品单购,3=限免；音频：0=免费,1=付费,2=试听,3=限免)
    uint16_t index;                     //列表索引index
    uint16_t play_duration;                  //音频时长
    uint16_t break_point;               //收听历史列表中记录的音频断点
	char title[XY_MAX_NAME_LEN];         //音频名称
    #ifdef XYSDK_SUPPORT_IMAGE_DOWNLOAD
	char image[XY_MAX_URL_LEN];         //专辑图片
    #endif
	char album_id[XY_MAX_ID_LEN];       //专辑id
	char track_id[XY_MAX_ID_LEN];       //音频id
    char history_track_id[XY_MAX_ID_LEN];   //收听历史列表中记录的音频id
    char timeline[XY_MAX_STR_LEN_16];       //收藏列表中分割时间点
}source_list_info_t;

//返回的声音列表结构体
typedef struct { 
    uint16_t source_total;  //资源总数
    uint16_t source_num;     //当前页资源数量
    uint16_t cur_page;       //当前页码
    uint8_t data_type;      // 0:专辑列表， 1：音频列表
    source_list_info_t source_array[XY_ALBUM_NUM_PER_PAGE];  //音频列表信息
} xy_get_source_list_resp_model;

//请求听单列表
typedef struct { 
    uint16_t page;                 //分页请求页码，从1开始
    uint8_t limit;                 //每页大小，返回[1,20]，默认使用XY_ALBUM_NUM_PER_PAGE传入
    char id[XY_MAX_ID_LEN];        //听单id；
} xy_get_listen_list_req_model;


//通过专辑id获取声音列表
typedef struct { 
    uint16_t page;                 //分页请求页码，从1开始
    uint8_t limit;                 //每页大小，返回[1,20]，默认使用XY_ALBUM_NUM_PER_PAGE传入
    uint8_t source_type;                // 1：大喜马  2：小喜马。未获取到默认传1 
    char album_id[XY_MAX_ID_LEN];        //专辑id；
    char record_id[XY_MAX_ID_LEN];      //非必传，需要定位当前音频在第几页时使用，用于收听历史，当传入改值时page参数无效
    char sort[XY_MAX_STR_LEN_8];        //asc-正序，desc-倒序，非必传，默认是asc
} xy_get_track_list_req_model;

//通过声音id获取声音列表
typedef struct { 
    uint16_t page;                 //分页请求页码，从1开始
    uint8_t limit;                 //每页大小，返回[1,20]，默认使用XY_ALBUM_NUM_PER_PAGE传入
    char track_id[XY_MAX_ID_LEN];      //音频id
    char sort[XY_MAX_STR_LEN_8];        //asc-正序，desc-倒序，非必传，默认是asc
} xy_get_track_req_model;


//听单列表信息
typedef struct{
	uint8_t source_type;                    // 1：大喜马  2：小喜马。未获取到默认传1
    uint8_t pay_type;                       //支付类型(专辑：0=免费,1=vip,2=精品单购,3=限免；音频：0=免费,1=付费,2=试听,3=限免)
    uint16_t play_duration;                 //音频时长
    uint8_t index;                      //index索引
	char listen_name[XY_MAX_STR_LEN_16];       //听单名称
    #ifdef XYSDK_SUPPORT_IMAGE_DOWNLOAD
	char image[XY_MAX_URL_LEN];             //听单图片
    #endif
	char listen_id[XY_MAX_ID_LEN];          //听单id
}listen_list_info_t;

//banner信息
typedef struct{
	uint8_t source_type;                // 1：大喜马  2：小喜马。未获取到默认传1
    uint8_t pay_type;                   //支付类型(专辑：0=免费,1=vip,2=精品单购,3=限免；音频：0=免费,1=付费,2=试听,3=限免)
    uint8_t jump_type;                  // 1:album 2: track  3:qrcode  4:listen
    uint8_t index;                      //index索引
    #ifdef XYSDK_SUPPORT_IMAGE_DOWNLOAD
    char image[XY_MAX_URL_LEN];         //图片
    #endif
	char jump_title[XY_MAX_NAME_LEN];        //标题
	char jump_value[XY_MAX_STR_LEN_128];        //跳转值
}banner_info_t;

//返回的首页结构体
typedef struct { 
    uint8_t banner_total;   //banner总数
    uint8_t listen_total;   //听单总数
    #ifdef XYSDK_SUPPORT_BANNER
    banner_info_t banner_array[XY_HOMEPAGE_BANNER_NUM_MAX];  //音频列表信息
    #endif
    listen_list_info_t listen_array[XY_HOMEPAGE_LISTEN_NUM_MAX];  //音频列表信息
} xy_get_homepage_info_resp_model;


//返回的弹窗信息结构体
typedef struct{
	uint32_t popup_id;                              //弹窗id
    uint32_t interval_duration;                     //两次弹窗间隔秒数
    uint16_t daily_max_count;                       //每日最大弹窗次数，0表示无限制
    uint8_t content_type;                           //内容类型（1：图片）
    uint8_t event_type;                             //跳转类型 1:album 2: track  3:qrcode  4:listen
	char content_title[XY_MAX_STR_LEN_64];          //内容标题
    char content_text[XY_MAX_STR_LEN_128];          //内容描述
	char content_value[XY_MAX_STR_LEN_128];         //内容值
    char event_value[XY_MAX_URL_LEN];               //跳转值
	char qr_img[XY_MAX_URL_LEN];                    //二维码图片，在need_qr_img为true时返回
}popup_screen_info_resp_model;


/*
*    获取播放url接口
*        req_param：需要传入的参数，类型是xy_get_url_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_url_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_play_url(xy_get_url_req_model* req_param, xy_get_url_resp_model *resp_data);


/*
*    获取临时token接口，内部使用
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_temp_token(void);


/*
*    获取登录支付二维码接口
*        req_param：需要传入的参数，类型是xy_get_qrcode_req_model结构体;
*       resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_qrcode_resp_model结构体；
*       返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_login_pay_qrcode(xy_get_qrcode_req_model* req_param, xy_get_qrcode_resp_model *resp_data);

/*
*   轮询获取登录支付信息,根据二维码action来获取对应的状态，若action是login时，获取到登录信息即可退出；
*   若action是buy时，未登录时需要获取登录和支付状态，已登录只获取到支付信息即可退出。
*        qrcode_id：需要传入的二维码id;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_qrcode_status_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*   根据resp_data里的值来判断登陆和支付是否成功。
*    当未登陆购买vip时，登陆成功后调用xy_common_get_user_vip_info()获取vip信息,若是vip则可以退出二维码直接请求播放
*      登录成功后的用户信息通过xy_common_get_user_info()获取
*/
int xy_api_http_get_login_pay_status(char *qrcode_id, xy_qrcode_status_resp_model *resp_data);

/*
*   用户账号退出接口
*        type：1：用户主动退出 2：refresh_token失效退出;
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_user_logout(uint8_t type);

/*
*   刷新token接口，内部使用
*  
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_refresh_access_token(void);

/*
* 获取用户vip信息，内部使用，外部使用调用xy_common_get_user_vip_info()获取
*/
int xy_api_http_user_vip_info(void);

/*
*    获取用户订阅列表
*        req_param：需要传入的参数，类型是xy_get_subscribe_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_source_list_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_user_subscribe_list(xy_get_subscribe_req_model* req_param, xy_get_source_list_resp_model *resp_data);

/*
*    订阅/取消订阅专辑
*        album_id：专辑id;
*        operation_type：0：取消订阅，1：订阅;
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_subcribe_ctrl(char *album_id, uint8_t operation_type);

/*
*    获取专辑的订阅状态
*        album_id：专辑id;
*        返回值：true：已订阅，false:未订阅
*/
bool xy_api_http_get_album_is_subcribe(char *album_id);

/*
*    获取用户收听历史列表
*        req_param：需要传入的参数，类型是xy_get_history_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_source_list_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_user_history_list(xy_get_history_req_model* req_param, xy_get_source_list_resp_model *resp_data);

/*
*    获取专辑的购买状态
*        album_id：专辑id;
*        返回值：true：已购买，false：未购买
*/
bool xy_api_http_get_album_is_bought(char *album_id);

/*
*    获取音频的购买状态
*        track_id：音频id;
*        返回值：true：已购买，false：未购买
*/
bool xy_api_http_get_track_is_bought(char *track_id);

/*
*    获取用户已购专辑列表
*        req_param：需要传入的参数，类型是xy_get_bought_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_source_list_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_user_bought_list(xy_get_bought_req_model* req_param, xy_get_source_list_resp_model *resp_data);


/*
*    上报播放历史数据
*        req_param：需要传入的参数，类型是xy_play_info_upload_model结构体;；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_upload_play_history(xy_play_info_upload_model* req_param);

/*
*    上报播放历史数据
*    数据上传时机
*    系统自动切歌时，比如播放到一首声音末尾，自动续播下一首声音时；
*    手动切歌，比如手动切换上一首或下一首时；
*    终止播放当前声音时，但注意暂停播放时不需要上传播放数据；
*    应用退出前需要把退出前正在播放的歌曲数据上传；
*
*        req_param：需要传入的参数，类型是xy_play_info_upload_model结构体;；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_upload_play_records(xy_play_info_upload_model* req_param);

/*
*    获取听单列表
*        req_param：需要传入的参数，类型是xy_get_listen_list_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_source_list_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_listen_info(xy_get_listen_list_req_model* req_param, xy_get_source_list_resp_model *resp_data);

/*
*    获取专辑id获取声音列表
*        req_param：需要传入的参数，类型是xy_get_track_list_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_source_list_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_track_list_by_albumId(xy_get_track_list_req_model* req_param, xy_get_source_list_resp_model *resp_data);

/*
*    获取音频id获取声音列表
*        req_param：需要传入的参数，类型是xy_get_track_req_model结构体;
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_source_list_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_track_list_by_trackId(xy_get_track_req_model* req_param, xy_get_source_list_resp_model *resp_data);

/*
*    获取首页信息接口
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是xy_get_homepage_info_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_homepage_info(xy_get_homepage_info_resp_model *resp_data);


/*
*    获取弹窗信息
*        need_qr_img: 是否需要二维码图片， 0：不需要  1：需要
*        resp_data：http拿到的数据，传入时需申请内存，数据类型是popup_screen_info_resp_model结构体；
*        返回值：0：成功，其他：失败，错误码请参考http_ret_value枚举
*/
int xy_api_http_get_popup_screen_info(uint8_t need_qr_img, popup_screen_info_resp_model *resp_data);

#endif // XYSDK_HTTP_API_H
