/**
 *@file sr_net_http.h
 *@brief HTTP协议抽象接口
 *@details 提供HTTP协议相关枚举、结构体、API声明
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author Lierda-RDC
 *@date 2024-04-01
 *@example ZhaoyangSDK\example\component\net_http_example.c
 */

#ifndef _SR_NET_HTTP_H
#define _SR_NET_HTTP_H

#include "sr_net_adapter.h"

/*!<HTTPC结构体别名*/
typedef struct SR_HTTP_CLIENT  SR_HTTP_CLIENT_T;

/**
 * @brief http事件类型枚举
 */
typedef enum
{
	
	SR_HTTP_EVT_GET_HEAD,        /*!<获取HEAD内容*/ 
	SR_HTTP_EVT_GET_HEAD_END,    /*!<获取HEAD结束*/ 	
	SR_HTTP_EVT_GET_BODY,        /*!<获取BODY内容*/
	SR_HTTP_EVT_GET_BODY_END,    /*!<获取BODY结束*/ 
	SR_HTTP_EVT_FAIL,            /*!<http失败*/     
	SR_HTTP_EVT_SEND_BODY_START, /*!<开始发送BODY，在这里发送POST的body数据，如果一次发送不完，可以在SR_HTTP_EVT_SEND_BODY回调里继续发送*/    
	SR_HTTP_EVT_SEND_BODY,       /*!<这里发送POST剩余的body数据*/  

	/*******以下事件内部使用，不通知用户*******/	
	SR_HTTP_EVT_IDLE,            /*!<空闲*/       
	 	
}SR_HTTP_EVT_E;


/**
 * @brief httpc事件回调函数类型
 *
 * @brief args  用户自定义参数
 * @brief event httpc事件
 * @brief data  数据指针,通常为SR_HTTP_DATA_T类型
 * @brief dataLen  数据长度
 */
typedef void (*HttpEventCb)(SR_HTTP_CLIENT_T *httpc,void *args,SR_HTTP_EVT_E event,char *data, uint32_t dataLen);

/**
 * @brief httpc底层操作函数集结构体
 */
typedef struct
{
	SR_HTTP_CLIENT_T *(*httpc_create)(HttpEventCb cb,void *cbArgs);	
	int (*httpc_destroy)(SR_HTTP_CLIENT_T *httpc);
	int (*httpc_get)(SR_HTTP_CLIENT_T *httpc,char *url);	
	int (*httpc_stop)(SR_HTTP_CLIENT_T *httpc);

	int (*httpc_set_user_head)(SR_HTTP_CLIENT_T *httpc, char *name, char *value);
}SR_HTTPC_OPS_T;



/**
 * @brief http数据结构体，组件内部传递传递http请求中的数据
 */
typedef struct SR_HTTP_DATA
{
    SR_HTTP_EVT_E event;  /*!<事件类型*/ 
    char *data;           /*!<事件携带的数据*/ 
    uint32_t dataLen;     /*!<事件携带数据的长度*/
}SR_HTTP_DATA_T;



/**
 * @brief http客户端结构体
 */
struct SR_HTTP_CLIENT
{
	SR_NET_ADP_T *adapter;    /*!< 网络适配器 */
	void *trdHandle;              /*!< 第三方平台控制句柄*/
	void *msgQueue;               /*!< 内部消息队列 */
	HttpEventCb eventCb; 		  /*!< 事件通知回调 */
	void *args;                   /*!< 事件回调用户自定义参数 */
	uint8_t isIpv6;				  /*!< 是否使用ipv6 */
	uint8_t isStop; 			  /*!< 是否停止传输 1:yes       0:no */
};



/*************************抽象接口***********************/
/**  
* @brief 创建HTTP客户端实例
*   
* @param[in] adapter 网络适配器指针 
* @param[in] cb      HTTP事件回调函数  
* @param[in] cbArgs  回调函数参数
*  
* @return 成功返回HTTP客户端实例指针，失败返回NULL  
*/ 
SR_HTTP_CLIENT_T * SR_NetHttpcCreate(SR_NET_ADP_T *adapter,HttpEventCb cb,void *cbArgs);

/**  
* @brief 销毁HTTP客户端实例
*   
* @param[in] httpc   HTTP客户端实例指针 
*  
* @return 成功返回0，失败返回负值错误码  
*/  
int SR_NetHttpcDestroy(SR_HTTP_CLIENT_T *httpc);

/**  
* @brief HTTP客户端发送GET请求
*   
* @param[in] httpc HTTP客户端实例指针 
* @param[in] url   请求的URL地址  
*  
* @return 成功返回0，失败返回负值错误码  
*/  
int SR_NetHttpcGet(SR_HTTP_CLIENT_T *httpc,char *url);

/**  
* @brief 停止HTTP客户端的请求
*   
* @param[in] httpc HTTP客户端实例指针 
*  
* @return 成功返回0，失败返回负值错误码  
*/  
int SR_NetHttpcStop(SR_HTTP_CLIENT_T *httpc);


#endif


