#include <stdio.h>
#include <string.h>
#include <sys/syslog.h>
#include <tdengine/client/taos.h>
#include <time.h>
#include "taos_database.h"

int tdengine_create_table(TAOS * tp, const char * tbname, int tablen)
{
    int ret;
    TAOS_RES * res;
    char tabsql[256];

    snprintf(tabsql, sizeof(tabsql),
        "CREATE STABLE IF NOT EXISTS %s (time timestamp, "
        "datatype TINYINT, result VARCHAR(64)) TAGS (tagname VARCHAR(128));", tbname);
    res = taos_query(tp, tabsql);
    ret = res ? taos_errno(res) : -1;
    if (ret != 0) {
        const char * err = taos_errstr(res);
        if (err == NULL)
            err = "unknown";
        fprintf(stderr, "Error, failed to create table '%s': %d, %s\n", tbname, ret, err);
        fflush(stderr);
        taos_free_result(res);
        return -1;
    } 
    taos_free_result(res);
    return 0;
}

TAOS* tdengine_connect(const char* host, const int port, const char* username, const char* pass, const char* db)
{
    const char* ip    = host ? host : DEFINE_TAOS_HOST;
    const char* user  = username ? username : DEFINE_TAOS_USERNAME;
    const char* passw = pass ? pass : DEFINE_TAOS_PASSWD;
    const int   p     = port ? port : DEFINE_TAOS_PORT;
    TAOS*       t     = taos_connect(ip, user, passw, db, p);
    if (t == NULL)
    {
        ems_syslog(LOG_ERR, "Error, failed to connect to TAOSD/%s\n", ip);
        return NULL;
    }
    return t;
}

void tdengine_disconnect(TAOS* tp)
{
    taos_close(tp);
}

static void str_replace_chr(char *line)
{
    for(int i = 0; line[i] != '\0';i++)
    {
        if(!( (line[i] >= '0' && line[i] <= '9') || (line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') || line[i] == '\0'|| line[i] == '_'))
        {
            line[i] = '_';
        }
    }
}


int init_taos_database_tables(proto_forward_t *proto_forward_p)
{
    char dev_no[DEV_NO_LEN];
    TAOS* taos = tdengine_connect(NULL, 0, NULL, NULL, OPC_HISTORY);
    if (taos == NULL)
    {
        return -1;
    }
    for (size_t i = 0; i < proto_forward_p->channels_size; i++)
    {
        for (size_t j = 0; j < proto_forward_p->channels[i]->devs_size; j++)
        {
            strncpy(dev_no, proto_forward_p->channels[i]->devs[j]->no, sizeof(dev_no));
            str_replace_chr(dev_no);
            tdengine_create_table(taos, dev_no, 0) ;
        }
    }
    tdengine_disconnect(taos);
    return 0;
}
