#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <poll.h>

#include "cloud_conn_common.h"
#include "dy_utils/protocol.h"

static void cloud_conn_loop(cloud_conn_var_t *var)
{
    int ret = 0;
    struct pollfd pfd;
    struct timespec tspec;

    while (1)
    {
        pfd.fd = var->status_timer;
        pfd.events = POLLIN;
        pfd.revents = 0;
        if (pfd.fd > 0)
            ret = poll(&pfd, 0x1, 10 * 1000);
        else {
            tspec.tv_sec = 5;
            tspec.tv_nsec = 0;
            nanosleep(&tspec, NULL);
        }
        if (ret < 0)
        {
            int error = errno;
            printf("errno %d\n", error);
            if (error == EINTR)
            {
                continue;
            }
            else
            {
                break;
            }
        }
        else if (ret > 0)
        {
            if (var->status_timer > 0 && pfd.revents)
            {
                comm_status_poll(var);
            }
        }
    }
}

static int cloud_conn_init(cloud_conn_var_t *var)
{
    get_board_sn(var->sn_str);
    get_process_name(var->proc_name);
    get_product_name(var->product_name);

    led_init();
    dy_syslog(LOG_INFO, "board SN:%s", var->sn_str);

    if (load_nodes_cfg(&var->nodes_cfg_table, NODES_CFG_PATH) == -1)
    {
        dy_syslog(LOG_ERR, "load nodes cfg fail");
    }

    cloud_conn_internal_mqtt_init(var);
    cloud_conn_mqtt_init(var);

    dy_syslog(LOG_INFO, "init done");

    return 0;
}

int main(int argc, char *argv[])
{
    cloud_conn_var_t var = {0};

    openlog("Config-Cloud", LOG_PID, LOG_DAEMON);
    memset(&var, 0, sizeof(var));

    cloud_conn_init(&var);
    cloud_conn_loop(&var);

    return 0;
}
