#pragma once

#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>

#include "esp_err.h"

typedef enum {
    BOARD_BUTTON_NONE = 0,
    BOARD_BUTTON_A,
    BOARD_BUTTON_B,
} board_button_t;

typedef struct {
    const char *hostname;
    float cpu_percent;
    float load_1m;
    float load_5m;
    uint64_t memory_used;
    uint64_t memory_total;
    float memory_percent;
    float swap_percent;
    uint64_t disk_used;
    uint64_t disk_total;
    float disk_percent;
    uint64_t network_rx_bytes;
    uint64_t network_tx_bytes;
    float network_rx_bps;
    float network_tx_bps;
    uint64_t uptime;
} board_server_snapshot_t;

typedef struct {
    const char *agent;
    const char *model;
    const char *effort;
    const char *session_id;
    const char *name;
    const char *cwd;
    const char *state;
    const char *activity_type;
    const char *latest_activity;
    const char *recent_text;
    const char *final_text; // Optional for older gateways; terminal reply, not activity.
    uint64_t elapsed_seconds;
} board_pi_snapshot_t;

esp_err_t board_init(const char *firmware_version);
const char *board_slug(void);
const char *board_display_name(void);
const char *board_last_error(void);
void board_set_device_id(const char *device_id);
void board_set_wifi_status(bool connected, const char *detail);
void board_set_cloud_status(bool connected);
void board_set_server_snapshot(const board_server_snapshot_t *snapshot);
void board_select_server_target(void);
void board_set_pi_snapshot(const board_pi_snapshot_t *snapshot);
void board_append_pi_activity(const char *activity_type, const char *activity);
void board_notify_pi(bool failed);
void board_next_page(void);
void board_previous_page(void);
void board_show_message(const char *title, const char *body);
void board_vibrate(uint32_t duration_ms);
void board_update(void);
board_button_t board_take_button_click(void);

void board_approval_request(const char *id, const char *agent, const char *title, const char *detail, unsigned expires_in);
void board_approval_cancelled(const char *id, const char *state);
bool board_take_approval_response(char *id, size_t size, bool *approve);

// Control sender runs separately from the display/button task.
bool board_take_control_message(char *out, size_t capacity);
void board_control_message(const char *json);
void board_capture_finished(uint64_t id, bool cancelled);
void board_voice_interrupted(uint64_t id);

bool board_voice_active(uint64_t id);

void board_agent_activity(const char *agent, const char *session_id, const char *type, const char *activity, const char *recent);
