#undef __STRICT_ANSI__

#include "ntp.h"

#include <qthing.h>

#include <freertos/FreeRTOS.h>
#include "freertos/task.h"
#include "apps/sntp/sntp.h"
#include <time.h>
#include <stdlib.h>
#include "esp_log.h"

#define TAG "NTP"

typedef struct {
    bool started;
    std::string address;
    qthing::ntp_callback_t callback;
} ntpd_parameter_t;

static ntpd_parameter_t parameter;

void ntp_task(void *ignored) {
    time_t now = 0;
    struct tm timeinfo = { 0 };

    ESP_LOGI(TAG, "Configuring ntp");
    sntp_setoperatingmode(SNTP_OPMODE_POLL);
    sntp_setservername(0, (char *)parameter.address.c_str());
    sntp_init();

    ESP_LOGI(TAG, "Waiting for time synchronization");
    do {
        vTaskDelay(100 / portTICK_PERIOD_MS);
        time(&now);
        localtime_r(&now, &timeinfo);
    } while(timeinfo.tm_year < 100);

    ESP_LOGI(TAG, "Time synchronized");
    if (parameter.callback != NULL) parameter.callback();

    vTaskDelete(NULL);
}

namespace qthing {

    void enable_ntp(std::string address, std::string timezone, qthing::ntp_callback_t callback) {
        if (parameter.started) {
            ESP_LOGE(TAG, "service already enabled");
            return;
        }
        ESP_LOGI(TAG, "Starting ntp");

        parameter = {true, address, callback};

        setenv("TZ", (char *)timezone.c_str(), 1);
        tzset();

        xTaskCreate(ntp_task, "ntp", 10000, NULL, 1, NULL);
    }
}