#ifndef RING_APP_H
#define RING_APP_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

enum ring_mode { RING_IDLE, RING_MEASURING, RING_RECORDING, RING_CHARGING, RING_LOW_BATTERY, RING_FAULT };
enum ring_result { RING_OK, RING_INVALID, RING_DENIED, RING_BUSY };
enum { RING_CLIP_MAX_MS = 5000, RING_CONSENT_MS = 3000, RING_HEALTH_MS = 20000,
       RING_HEALTH_INTERVAL_MS = 300000, RING_STATUS_BYTES = 12 };
struct ring_inputs {
    bool battery_valid, connected, encrypted, subscribed, charging, fault, worn;
    uint16_t battery_mv;
};
struct ring_app {
    enum ring_mode mode;
    struct ring_inputs in;
    uint32_t mode_started, last_health, consent_at;
    bool manual_health;
    bool consent, health_requested;
    uint16_t clip_ms;
    uint32_t clip_id;
};
void ring_init(struct ring_app *a, uint32_t now);
void ring_inputs_set(struct ring_app *a, struct ring_inputs in, uint32_t now);
void ring_local_consent(struct ring_app *a, uint32_t now);
enum ring_result ring_command(struct ring_app *a, const uint8_t *data, size_t len, uint32_t now);
void ring_tick(struct ring_app *a, uint32_t now);
void ring_status(const struct ring_app *a, uint8_t out[RING_STATUS_BYTES]);
#endif
