#include "common.h"

int stop_rx = 0;

int mqtt_handle_recv_msg(void *obj, ipc_msg_t *mqtt_msg)
{
    fastzigbee_var_t *var = (fastzigbee_var_t *)obj;
    char *data_str = NULL;
    char *sn = NULL;
    char bin_buff[1024] = {0};
    char buf[32];
    int len;
    node_cfg_t *node = var->nodes_table.nodes[0].node;
    // dy_syslog(LOG_DEBUG, "mqtt rcv:%s", mqtt_msg->payload);

    cJSON *root = cJSON_Parse(mqtt_msg->payload);
    if (!root)
    {
        return -1;
    }
    GET_JSON_VALUE_DY_STRING(root, "data_b64", data_str);
    GET_JSON_VALUE_DY_STRING(root, "sn", sn);
    cJSON_Delete(root);

    if (data_str != NULL && sn != NULL && strcmp(sn, node->sn) == 0)
    {
        stop_rx = 1;
        sleep(1);
        len = b64_decode(data_str, bin_buff + 5, 1024 - 5);
        bin_buff[0] = 0xA5;
        bin_buff[1] = len + 3;
        bin_buff[2] = 0xD1;
        bin_buff[3] = var->dev_info->DstAddr & 0xFF;
        bin_buff[4] = (var->dev_info->DstAddr >> 8) & 0xFF;
        bin_buff[len + 5] = 0x5A;
        uart_send(var->fd, bin_buff, len + 6);
        dy_syslog_hex(LOG_DEBUG, bin_buff, strlen(bin_buff), "send len:%d", strlen(bin_buff));
        stop_rx = 0;
    }

    free(sn);
    free(data_str);
    return 0;
}

static void send_raw_data_to_pp(fastzigbee_var_t *var, unsigned char *value, int value_len)
{
    if (var->nodes_table.node_cnt <= 0)
    {
        return;
    }

    node_cfg_t *node = var->nodes_table.nodes[0].node;

    cJSON *rt_data = cJSON_CreateObject();
    char buf[512] = {0};
    char topic[TOPIC_MAX_LEN] = {0};
    time_t ts = time(NULL);
    cJSON_AddStringToObject(rt_data, "port", "ZIGBEE");
    cJSON_AddStringToObject(rt_data, "sn", node->sn);
    cJSON_AddNumberToObject(rt_data, "ts", ts);
    b64_encode(value, value_len, buf, 512);
    cJSON_AddNumberToObject(rt_data, "len", value_len);
    cJSON_AddStringToObject(rt_data, "data_b64", buf);
    char *data_tmp = cJSON_Print(rt_data);

    snprintf(topic, TOPIC_MAX_LEN, "ipc/%s/%s/device/%s/data/%s", var->sn_str, "ZIGBEE",
             node->sn, "raw_data");

    ipc_session_publish(var->session, topic, data_tmp, strlen(data_tmp));
    free(data_tmp);
    cJSON_Delete(rt_data);
}

static int handle_packet(fastzigbee_var_t *var, unsigned char *buff, int len)
{
    send_raw_data_to_pp(var, buff, len);
}

void *recv_loop(void *param)
{
    fastzigbee_var_t *var = (fastzigbee_var_t *)param;
    int fd = var->fd;
    int ret = -1, maxfd, i;
    fd_set rset;
    struct timeval timeout;
    unsigned char rcv_buf[1024];
    unsigned char buf[32];
    char print_buf[4096];
    int len = 0;
    int count = 0;

    while (1)
    {
        if (stop_rx != 0)
        {
            sleep(1);
            continue;
        }
        len = uart_recv(fd, rcv_buf, 1024);
        if (len > 0)
        {
            dy_syslog_hex(LOG_DEBUG, rcv_buf, len, "rcv");
            handle_packet(var, rcv_buf, len);
        }
    }

    return NULL;
}