#include "app_state.h"
#include "button.h"
#include "camera.h"
#include "esp_err.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "http_dashboard.h"
#include "led.h"
#include "portrait_engine.h"
#include "servo_ctrl.h"
#include "wifi.h"

static const char *TAG = "main";

static void log_if_error(const char *label, esp_err_t err)
{
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "%s failed: %s", label, esp_err_to_name(err));
    }
}

void app_main(void)
{
    ESP_LOGI(TAG, "SCARA portrait robot boot");

    app_state_init();
    log_if_error("led_init", led_init());
    log_if_error("servo_ctrl_init", servo_ctrl_init());
    log_if_error("camera_init", camera_init());
    log_if_error("portrait_engine_init", portrait_engine_init());
    log_if_error("button_init", button_init());
    log_if_error("wifi_init_sta", wifi_init_sta());
    log_if_error("http_dashboard_start", http_dashboard_start());

    app_state_set_mode(MODE_RUNNING);
    app_state_set_state(STATE_IDLE);

    while (1) {
        ESP_LOGI(
            TAG,
            "heartbeat mode=%d state=%d",
            (int)app_state_get_mode(),
            (int)app_state_get_state());
        vTaskDelay(pdMS_TO_TICKS(5000));
    }
}
