#include "bsp_net_http_hzluat.h"
#include "sr_osal.h"
#include "sr_config.h"

#include "sr_log.h"


#include "luat_network_adapter.h"
#include "networkmgr.h"
#include "luat_http.h"



#define  MSG_QUEUE_ITEM_NUM   16

static void _LuatHttpCb(int status, void *data, uint32_t dataLen, void *args)
{
	char *headData;
	char *bodyData;
	int ret =-1;

	SR_HTTP_CLIENT_T *httpc = (SR_HTTP_CLIENT_T *)args;
	SR_HTTP_DATA_T httpData = {0};

	BSP_LOG(DEBUG,"[http] cb:status=%d",status);
	
	if(status < 0) 
	{
		httpData.event = SR_HTTP_EVT_FAIL;
		ret = osMessageQueuePut (httpc->msgQueue, &httpData, 0,osWaitForever);
		
		BSP_LOG(DEBUG,"[HTTP] bsp: http error,queRet(%d)",ret);
		return;
	}
	
	switch(status)
	{
	case HTTP_STATE_GET_BODY:
		if (data)
		{
			bodyData = SR_OsMalloc(dataLen);
			memcpy(bodyData, data, dataLen);

			httpData.event = SR_HTTP_EVT_GET_BODY;
			httpData.data = bodyData;
			httpData.dataLen = dataLen;			
			ret = osMessageQueuePut (httpc->msgQueue, &httpData, 0,osWaitForever);			
			
			BSP_LOG(DEBUG,"GET_BODY: dataLen=%d ,queRet(%d)\r\n",dataLen,ret);
		}
		else
		{
			httpData.event = SR_HTTP_EVT_GET_BODY_END;
			ret = osMessageQueuePut (httpc->msgQueue, &httpData, 0,osWaitForever);			
			
			BSP_LOG(DEBUG,"GET_BODY_END,queRet(%d)\r\n\r\n",ret);
		}
		break;
	case HTTP_STATE_GET_HEAD:
		if (data)
		{
			headData = SR_OsMalloc(dataLen);
			memcpy(headData, data, dataLen);

			httpData.event = SR_HTTP_EVT_GET_HEAD;
			httpData.data = headData;
			httpData.dataLen = dataLen; 		
			ret = osMessageQueuePut (httpc->msgQueue, &httpData, 0,osWaitForever);	

			BSP_LOG(DEBUG,"GET_HEAD: dataLen=%d,queRet(%d)\r\n	 %.*s\r\n",dataLen,ret,dataLen,headData);
		}
		else
		{
			
			httpData.event = SR_HTTP_EVT_GET_HEAD_END;			
			ret = osMessageQueuePut (httpc->msgQueue, &httpData, 0,osWaitForever);			

			BSP_LOG(DEBUG,"GET_HEAD_DONE, queRet(%d)\r\n\r\n",ret);
		}
		break;
	case HTTP_STATE_IDLE:
		break;
	case HTTP_STATE_SEND_BODY_START:
		//如果是POST，在这里发送POST的body数据，如果一次发送不完，可以在HTTP_STATE_SEND_BODY回调里继续发送
		break;
	case HTTP_STATE_SEND_BODY:
		//如果是POST，可以在这里发送POST剩余的body数据
		break;
	default:
		break;
	}

}


SR_HTTP_CLIENT_T * _LuatHttpcCreate(HttpEventCb cb,void *cbArgs)
{
	//if(!adapter || !httpc) return SR_INVALID;

	//创建httpc
	SR_HTTP_CLIENT_T *httpc = (SR_HTTP_CLIENT_T *)SR_OsMalloc(sizeof(SR_HTTP_CLIENT_T));
	if(!httpc) goto _SR_HTTPC_ERR;

	memset(httpc,0,sizeof(SR_HTTP_CLIENT_T));


	//原厂句柄创建,args传入httpc
	luat_http_ctrl_t *httpCtrl = luat_http_client_create(_LuatHttpCb, httpc, -1);

    if(!httpCtrl) goto _LUAT_HTTPC_ERR;

	//创建消息队列
	httpc->msgQueue =  osMessageQueueNew (MSG_QUEUE_ITEM_NUM, sizeof(SR_HTTP_DATA_T), SR_NULL);
    if(SR_NULL == httpc->msgQueue) goto _QUEUE_ERR;
	

	httpc->trdHandle = httpCtrl;
	httpc->eventCb = cb;
	httpc->args = cbArgs;
    return httpc;


_QUEUE_ERR:
_LUAT_HTTPC_ERR:
	SR_OsFree(httpc);
_SR_HTTPC_ERR:
	return SR_NULL;
}


int _LuatHttpcDestroy(SR_HTTP_CLIENT_T *httpc)
{
	int ret =-1;
	luat_http_ctrl_t * httpCtrl = (luat_http_ctrl_t *)httpc->trdHandle;
	
	osMessageQueueDelete(httpc->msgQueue);  //删除队列	
	
	//hezhou: 成功返回0，其他值失败
	ret = luat_http_client_destroy(&httpCtrl);

	SR_OsFree(httpc);
	
	return (ret==0)? SR_OK:SR_FAIL;
}


int _LuatHttpcGet(SR_HTTP_CLIENT_T *httpc,char *url)
{
	int ret = SR_OK,msgRet;
	SR_HTTP_DATA_T httpData ={0};
	luat_http_ctrl_t *httpCtrl = (luat_http_ctrl_t *)httpc->trdHandle;
	
	BSP_LOG(DEBUG,"[HTTP] url %s", url);
	httpc->isStop =0;
	osMessageQueueReset(httpc->msgQueue); //清空消息队列
	luat_http_client_start(httpCtrl, url, 0, httpc->isIpv6, 1);

	uint32_t queCnt =0;
	while (!httpc->isStop)
	{	
		//SR_PRINTF("[PROB] que cnt(%d) space(%d)",osMessageQueueGetCount(httpc->msgQueue),osMessageQueueGetSpace(httpc->msgQueue));
		msgRet =osMessageQueueGet(httpc->msgQueue, &httpData,0,1000);
		if(httpc->isStop) goto _END;		
		if(msgRet!= osOK)  continue;
		
		//SR_PRINTF("[PROB] que cnt(%d) space(%d)",osMessageQueueGetCount(httpc->msgQueue),osMessageQueueGetSpace(httpc->msgQueue));

		switch(httpData.event)
		{
			case SR_HTTP_EVT_GET_HEAD:
				// 在这里处理head数据
	            if(httpc->eventCb) httpc->eventCb(httpc,httpc->args,SR_HTTP_EVT_GET_HEAD,httpData.data,httpData.dataLen);
				SR_OsFree(httpData.data);
				break;
			case SR_HTTP_EVT_GET_HEAD_END:			
	            if(httpc->eventCb) httpc->eventCb(httpc,httpc->args,SR_HTTP_EVT_GET_HEAD_END,0,0);
				BSP_LOG(DEBUG,"[HTTP] bsp: status %d total %u", luat_http_client_get_status_code(httpCtrl), httpCtrl->total_len);
				break;
			case SR_HTTP_EVT_GET_BODY:
				// 在这里处理body数据		
	            if(httpc->eventCb) httpc->eventCb(httpc,httpc->args,SR_HTTP_EVT_GET_BODY,httpData.data,httpData.dataLen);
				SR_OsFree(httpData.data);
				break;
			case SR_HTTP_EVT_GET_BODY_END:			
	            if(httpc->eventCb) httpc->eventCb(httpc,httpc->args,SR_HTTP_EVT_GET_BODY_END,0,0);	
				httpc->isStop = 1;
			
				break;
			case SR_HTTP_EVT_FAIL:			
	            if(httpc->eventCb) httpc->eventCb(httpc,httpc->args,SR_HTTP_EVT_FAIL,0,0);
				ret = SR_ENET;
				httpc->isStop = 1;
				break;
			default:
				break;
		}
	}

_END:
	BSP_LOG(DEBUG,"[HTTP] close");
	luat_http_client_close(httpCtrl);
	return ret;
	
}

int _LuatHttpcStop(SR_HTTP_CLIENT_T *httpc)
{
	httpc->isStop = 1;
	return 0;
}


