/**
 *@file    sr_net_mqtt.c
 *@brief   MQTT协议抽象接口
 *@details 提供MQTTC 初始化/去初始化、连接/断连、发布/订阅、异步处理等功能的具体实现
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-04-01
 *@example ZhaoyangSDK\example\component\net_mqtt_example.c
 */


#include "sr_net_mqtt.h"

#include "sr_config.h"

int _GetNextPacketId(SR_MQTT_CLIENT_T *mqttc)
{
  return mqttc->nextPacketId = (mqttc->nextPacketId == MQTT_MAX_PACKET_ID) ? 1 : mqttc->nextPacketId + 1;
}




int SR_NetMqttcInit(SR_NET_ADP_T *adp, SR_MQTT_CLIENT_T *mqttc,SR_MQTT_INIT_PARAMS_T *initParams)
{

	if((SR_NULL == adp) || (SR_NULL == mqttc) || (SR_NULL == initParams)) return SR_INVALID;

	SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)(adp->mqttcOps);
    mqttc->adapter = adp;
    

    if ((SR_NULL == ops) ||(SR_NULL == ops->mqttc_init))
    {
        return SR_NOIMPT;
    }
    
    return ops->mqttc_init(mqttc, initParams);
}

int SR_NetMqttcDeinit(SR_MQTT_CLIENT_T *mqttc)
{
	if((SR_NULL == mqttc) || (SR_NULL == mqttc->adapter)) return SR_INVALID;

    SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)mqttc->adapter->mqttcOps;

    if ((SR_NULL == ops) || (SR_NULL == ops->mqttc_deinit))
    {
        return SR_NOIMPT;
    }

    return ops->mqttc_deinit(mqttc);
}


int SR_NetMqttcConnect(SR_MQTT_CLIENT_T *mqttc, SR_MQTT_CONN_PARAMS_T *connParams)
{
	if((SR_NULL == mqttc) || (SR_NULL == mqttc->adapter) || (SR_NULL == connParams)) return SR_INVALID;

    SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)mqttc->adapter->mqttcOps;


    if ((SR_NULL == ops)|| (SR_NULL == ops->mqttc_connect))
    {
        return SR_NOIMPT;
    }

    return ops->mqttc_connect(mqttc, connParams);
}


int SR_NetMqttcDisconnect(SR_MQTT_CLIENT_T *mqttc)
{	
	if((SR_NULL == mqttc) || (SR_NULL == mqttc->adapter)) return SR_INVALID;
	
    SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)mqttc->adapter->mqttcOps;


    if ((SR_NULL == ops)|| (SR_NULL == ops->mqttc_disconnect))
    {
        return SR_NOIMPT;
    }

    return ops->mqttc_disconnect(mqttc);
}



int SR_NetMqttcPublish(SR_MQTT_CLIENT_T *mqttc, SR_MQTT_QOS_E qos, char *topic, char *msg,uint16_t msgLen)
{
	if((SR_NULL == mqttc) || (SR_NULL == mqttc->adapter) || (SR_NULL == topic) || (SR_NULL == msg)) return SR_INVALID;

    SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)mqttc->adapter->mqttcOps;

#if  0
    if (mqttc->isconnected != 1)
    {
        BSP_DEBUG_PRINTF("Module %s mqtt clien  publish state error!", mqttc->device->name);
        return SR_FAIL;
    }
#endif

    if((SR_NULL == ops)||(SR_NULL == ops->mqttc_publish))
    {
        return SR_NOIMPT;
    }

    return ops->mqttc_publish(mqttc, qos,topic, msg,msgLen);

}

int SR_NetMqttcSubscribe(SR_MQTT_CLIENT_T *mqttc, char *topic, SR_MQTT_QOS_E qos)
{ 
	if((SR_NULL == mqttc) || (SR_NULL == mqttc->adapter) || (SR_NULL == topic)) return SR_INVALID;

    SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)mqttc->adapter->mqttcOps;

#if  0
    if (mqttc->isconnected != 1)
    {
        BSP_DEBUG_PRINTF("Module %s mqtt client Subscribe state error!", mqttc->device->name);
        return SR_FAIL;
    }
#endif

    if ((SR_NULL == ops)||(SR_NULL == ops->mqttc_subscribe))
    {
        return SR_NOIMPT;
    }

    return ops->mqttc_subscribe(mqttc, topic, qos);
}


int SR_NetMqttcUnsub(SR_MQTT_CLIENT_T *mqttc, char *topic)
{
	if((SR_NULL == mqttc) || (SR_NULL == mqttc->adapter) || (SR_NULL == topic)) return SR_INVALID;

    SR_MQTTC_OPS_T *ops = (SR_MQTTC_OPS_T *)mqttc->adapter->mqttcOps;

#if  0
    if (mqttc->isconnected != 1)
    {
        BSP_DEBUG_PRINTF("Module %s mqtt client unsubscribe state error!", mqttc->device->name);
        return SR_FAIL;
    }
#endif

    if ((SR_NULL == ops)||(SR_NULL == ops->mqttc_unsubscribe))
    {
        return SR_NOIMPT;
    }

    return ops->mqttc_unsubscribe(mqttc, topic);

}


int SR_NetMqttcSetSubTable(SR_MQTT_CLIENT_T *mqttc, SR_SUB_CB_TABLE_T  *table,uint8_t tableSize)
{
 
	if(SR_NULL == mqttc) return SR_INVALID;
	mqttc->table = table;
	mqttc->tableSize = tableSize;

	return SR_OK;
}
int SR_NetMqttcSetEvtCb(SR_MQTT_CLIENT_T *mqttc,MqttEventCb cb)
{
 
	if(SR_NULL == mqttc) return SR_INVALID;
	mqttc->eventCallback = cb;

	return SR_OK;
}




