#pragma once
#include "rpc.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    RpcAppEventSessionClose,
    RpcAppEventAppExit,
    RpcAppEventLoadFile,
    RpcAppEventButtonPress,
    RpcAppEventButtonRelease,
} RpcAppSystemEvent;

typedef void (*RpcAppSystemCallback)(RpcAppSystemEvent event, void* context);
typedef void (
    *RpcAppSystemDataExchangeCallback)(const uint8_t* data, size_t data_size, void* context);

typedef struct RpcAppSystem RpcAppSystem;

void rpc_system_app_set_callback(RpcAppSystem* rpc_app, RpcAppSystemCallback callback, void* ctx);

void rpc_system_app_send_started(RpcAppSystem* rpc_app);

void rpc_system_app_send_exited(RpcAppSystem* rpc_app);

const char* rpc_system_app_get_data(RpcAppSystem* rpc_app);

void rpc_system_app_confirm(RpcAppSystem* rpc_app, RpcAppSystemEvent event, bool result);

void rpc_system_app_set_error_code(RpcAppSystem* rpc_app, uint32_t error_code);

void rpc_system_app_set_error_text(RpcAppSystem* rpc_app, const char* error_text);

void rpc_system_app_error_reset(RpcAppSystem* rpc_app);

void rpc_system_app_set_data_exchange_callback(
    RpcAppSystem* rpc_app,
    RpcAppSystemDataExchangeCallback callback,
    void* ctx);

void rpc_system_app_exchange_data(RpcAppSystem* rpc_app, const uint8_t* data, size_t data_size);

#ifdef __cplusplus
}
#endif