#include "common.h"

char *ble_ds_print(ble_var_t *var, unsigned int *cnt)
{
    struct adapter *adapter = var->adapter;
    int i;
    bool online;
    time_t now = time(NULL);

    if (adapter == NULL)
    {
        return NULL;
    }

    ble_slave_cfg_t *slave_cfg = &adapter->slave_cfg;

    cJSON *root = cJSON_CreateObject();
    if (root == NULL)
    {
        return NULL;
    }
    cJSON *nodes = cJSON_CreateArray();
    cJSON_AddItemToObject(root, "status", nodes);

    for (i = 0; i < slave_cfg->dev_cnt; i++)
    {
        ble_slave_dev_t *slave_dev = &slave_cfg->slave[i];
        if (slave_dev->state_changed)
        {
            slave_dev->state_changed = false;
            *cnt++;
        }
        cJSON *item = cJSON_CreateObject();
        cJSON_AddItemToArray(nodes, item);
        if (item)
        {
            cJSON_AddStringToObject(item, "sn", slave_dev->SN);
            cJSON_AddNumberToObject(item, "pak_rssi", 0);
            cJSON_AddBoolToObject(item, "online", slave_dev->state == SLAVE_DEV_CONNECTED);
        }
    }

    char *str = (cJSON_Print(root));
    cJSON_Delete(root);
    return str;
}

void *ble_thread_loop(void *param)
{
    ble_var_t *var = (ble_var_t *)param;
    char exec_cmd[256] = {0};
    char *buff = NULL;
    int ret;
    int i = 0;

    if (load_templates_cfg(&var->template_table, TEMPLATES_CFG_PATH) == -1)
    {
        dy_syslog(LOG_ERR, "load template cfg fail");
    }
    char file_path[64] = {0};
    sprintf(file_path, "%s/ble_status_%d.json", NODES_CACHE, var->slot);

    while (true)
    {
        unsigned int cnt = 0;
        time_t now = time(NULL);
        static time_t lasttime = 0;
        /*
            Bug:
                使用btmon能收到设备上报的数据，但是Bluetoothd没有将消息发送到dbus总线上，导致数据无法上报；
            workaround:
                我们发现设备重连可以从此错误状态中出来；
                监控设备连接状态，如果连接上了但是超过30秒仍未收到数据则断连让其重连
        */
        do
        {
            struct adapter *adapter = var->adapter;
            if (adapter == NULL)
            {
                break;
            }
            ble_slave_cfg_t *slave_cfg = &adapter->slave_cfg;
            for (i = 0; i < slave_cfg->dev_cnt; i++)
            {
                ble_slave_dev_t *slave_dev = &slave_cfg->slave[i];
                if (slave_dev->state == SLAVE_DEV_CONNECTED)
                {
                    int last = slave_dev->last_ms/1000;
                    if (now > last && (now - last) > 60)
                    {
                        // 超过30秒没有收到该设备任何数据，让其断连
                        dy_syslog(LOG_DEBUG, "exceed 30s have not rcv data, reconnect it");
                        disconnect_dev(var, slave_dev);
                    }
                }
            }
        } while (0);

        char *node_status = ble_ds_print(var, &cnt);
        if (node_status != NULL)
        {
            if (cnt > 0 || (now - lasttime) > 300)
            {
                char topic[TOPIC_MAX_LEN];
                int ret = 0;

                snprintf(topic, TOPIC_MAX_LEN, "ipc/%s/%s/%s", var->sn_str, "process", TOPIC_EVT_NODESSTATUS);

                ret = ipc_session_publish(var->session, topic, node_status, strlen(node_status));
                if (ret == 0)
                {
                    lasttime = now;
                }
                sprintf(topic, "G/%s/%s/device/%s/service/%s", var->sn_str, TOPIC_GATEWAY_CONFIG, var->sn_str, TOPIC_EVT_NODESSTATUS);
                ret = ipc_session_publish(var->session, topic, node_status, strlen(node_status));
                if (ret == 0)
                {
                    lasttime = now;
                }
                write_file_data("/tmp/ble_state_report", node_status, strlen(node_status));
            }

            write_file_data(file_path, node_status, strlen(node_status));
            free(node_status);
        }

        sleep(10);
    }
}
