#include "board.h"
#include "cloud_client.h"
#include "esp_err.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "wifi_manager.h"

static const char *TAG = "BOOT";

extern "C" void app_main(void)
{
    ESP_LOGI(TAG, "[BOOT] firmware %s", DEVICE_LAB_FIRMWARE_VERSION);

    esp_err_t nvs_result = nvs_flash_init();
    // Preserve preferences/future NVS formats. Local defaults remain usable;
    // an unavailable store reports APPLIED / NOT SAVED rather than erasing it.
    if (nvs_result != ESP_OK) {
        ESP_LOGW(TAG, "[PREFS] NVS unavailable: %s; preserving partition", esp_err_to_name(nvs_result));
    }

    const esp_err_t board_result = board_init(DEVICE_LAB_FIRMWARE_VERSION);
    if (board_result != ESP_OK) {
        ESP_LOGE(TAG, "[DIAG] board initialization failed: %s, error=%s (%d)",
                 board_last_error(), esp_err_to_name(board_result), board_result);
        ESP_LOGE(TAG, "[DIAG] firmware will remain running for serial diagnosis; Wi-Fi and cloud are not started");
        while (true) {
            vTaskDelay(pdMS_TO_TICKS(10000));
            ESP_LOGE(TAG, "[DIAG] board still unavailable: %s (no reboot)", board_last_error());
        }
    }
    ESP_LOGI(TAG, "[BOARD] %s", board_display_name());

    if (wifi_manager_start() == ESP_OK) {
        ESP_ERROR_CHECK(cloud_client_start());
    }

    while (true) {
        board_update();
        const board_button_t button = board_take_button_click();
        if (button == BOARD_BUTTON_A) {
            ESP_LOGI(TAG, "[BUTTON] A click");
            board_next_page();
            cloud_client_send_button("A");
        } else if (button == BOARD_BUTTON_B) {
            ESP_LOGI(TAG, "[BUTTON] B click");
            board_previous_page();
            cloud_client_send_button("B");
        }
        char approval_id[65];
        bool approve = false;
        if (board_take_approval_response(approval_id, sizeof(approval_id), &approve)) {
            if (!cloud_client_send_approval(approval_id, approve))
                board_approval_cancelled(approval_id, "CANCELLED");
        }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}
