#include <stdio.h>

#include "esp_log.h"
#include "esp_pm.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "sdkconfig.h"
#include "soc/gpio_num.h"
#include "esp_event.h"

#include "types.hpp"
#include "led.hpp"
#include "network.hpp"

static const char *TAG = "ClientMain";

extern "C" void app_main()
{
    ESP_LOGI(TAG, "Hello, Calendink Client!");

    // Initialize NVS (required for some Wi-Fi configurations and network features)
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    ESP_ERROR_CHECK(esp_event_loop_create_default());

    setup_led();
    ESP_LOGI(TAG, "LED setup complete");
    vTaskDelay(pdMS_TO_TICKS(1000));

    ESP_LOGI(TAG, "LED blink 4");
    led_blink_number(4, 255,255,255);
    vTaskDelay(pdMS_TO_TICKS(1000));

    ESP_LOGI(TAG, "LED blink 2");
    led_blink_number(2, 255,255,255);

    turn_off_led();
    ESP_LOGI(TAG, "LED blink complete");
    vTaskDelay(pdMS_TO_TICKS(1000));

    // Connect to WiFi
    // ESP_LOGI(TAG, "Initializing WiFi connection");
    
    // // Attempting to connect, we don't necessarily need to block forever here
    // // as network.cpp already handles some of the retries
    // esp_err_t err = connect_wifi(CONFIG_CALENDINK_WIFI_SSID, CONFIG_CALENDINK_WIFI_PASSWORD, false);
    
    // if (err == ESP_OK) {
    //     uint8_t retries = 1;
    //     do {
    //         err = check_wifi_connection(retries);
    //         if (err != ESP_OK) {
    //             ESP_LOGW(TAG, "WiFi connection check timeout, retrying... (%d)", retries);
    //             vTaskDelay(pdMS_TO_TICKS(1000));
    //         }
    //         retries++;
    //     } while (err == ESP_ERR_TIMEOUT && retries <= CONFIG_CALENDINK_WIFI_RETRIES);
    // }
    
    // if (err == ESP_OK) {
    //     ESP_LOGI(TAG, "Successfully connected to WiFi!");
    // } else {
    //     ESP_LOGE(TAG, "Failed to connect to WiFi.");
    // }

    while (true)
    {
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
