#ifndef AIW_SOC_UI_CLIENT_H
#define AIW_SOC_UI_CLIENT_H

#include "ai_wire.h"

typedef struct {
    uint64_t session_id;
    uint32_t next_sequence;
    aiw_ui_command pending_command;
    bool session_open;
    bool command_pending;
} aiw_soc_ui_client;

/* session_id must come from the SoC boot/session owner and must be nonzero. */
bool aiw_soc_ui_client_init(aiw_soc_ui_client *client, uint64_t session_id);
bool aiw_soc_ui_client_encode_session_open(const aiw_soc_ui_client *client,
                                          uint8_t *out, size_t capacity,
                                          size_t *written);
bool aiw_soc_ui_client_accept_session_ack(aiw_soc_ui_client *client,
                                          const aiw_ui_ack *ack);
bool aiw_soc_ui_client_begin_command(aiw_soc_ui_client *client, uint8_t button,
                                     uint8_t *out, size_t capacity,
                                     size_t *written);
/* Retries the exact same sequence/button until a matching ACK is received. */
bool aiw_soc_ui_client_retry_command(const aiw_soc_ui_client *client,
                                     uint8_t *out, size_t capacity,
                                     size_t *written);
bool aiw_soc_ui_client_accept_command_ack(aiw_soc_ui_client *client,
                                          const aiw_ui_ack *ack);

#endif
