#include "common.h"

int stop_rx = 0;

int mqtt_handle_recv_msg(void *obj, ipc_msg_t *mqtt_msg)
{
    ra06_var_t *var = (ra06_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);
        strcpy(bin_buff, "AT+MSG=");
        len = b64_decode(data_str, bin_buff + strlen(bin_buff), 1024 - strlen(bin_buff));
        strcpy(bin_buff + strlen(bin_buff), "\r\n");
        modem_send_data(var->fd, bin_buff, strlen(bin_buff), "+OK");
        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(ra06_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", "LORA_2");
    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, "LORA_2",
             node->sn, "raw_data");

    ipc_session_publish(var->session, topic, data_tmp, strlen(data_tmp));
    free(data_tmp);
    cJSON_Delete(rt_data);
}

// 2b 52 65 63 76 3a 31 32 33 34 35 36 10 20 2c 20 38 62 79 74 65 73 2c
// 20 52 73 73 69 3a 2d 31 31 34 2e 30 2c 20 53 6e 72 3a 2d 31 35 0d 0a
// +Recv:123456 , 8bytes, Rssi:-114.0, Snr:-15
static int handle_packet(ra06_var_t *var, unsigned char *buff, int len)
{
    // int i = len - 1;
    // int j = 0;

    // while (i > 0)
    // {
    //     if (buff[i] == ',')
    //     {
    //         j++;
    //     }
    //     i--;
    //     if (j == 3)
    //     {
    //         break;
    //     }
    // }

    // dy_syslog_hex(LOG_DEBUG, buff, len, "data:");
    send_raw_data_to_pp(var, buff, len);
}

void *recv_loop(void *param)
{
    ra06_var_t *var = (ra06_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)
        {
            handle_packet(var, rcv_buf, len);
        }
    }

    return NULL;
}