#ifndef EM_ESI_MANAGER_H
#define EM_ESI_MANAGER_H

#include "em_context.h"

int em_esi_check_init_state(const uint8_t *init_state);
int em_esi_initialize(uint32_t version, uint8_t *data, uint8_t *key, uint32_t esi_ctr);
int em_esi_update(const uint32_t version, uint8_t *esi_buf, em_esi_meta *meta, const em_esi_item *item,
		  const uint8_t *key, const uint32_t key_len);
int em_esi_update_item(const uint32_t version, uint8_t *data, const uint32_t type, const uint8_t *_item,
		       const uint8_t *key, const uint32_t key_len);
int em_esi_get_item(const uint8_t *data, const uint32_t type, uint8_t *buf, const uint32_t buf_len);
int em_esi_remove_item(const uint32_t version, uint8_t *esi, const uint32_t type, const uint8_t *key,
		       const uint32_t key_len);
int em_get_tuc_table(uint8_t *esi, void *buf, uint32_t len_buf);
int em_esi_check_validation_v20(em_context *ctx);
int em_esi_check_validation(uint8_t *local_esi);

int em_esi_get_all_item(const uint8_t *esi, em_esi_item *buf, uint32_t buf_size);
int em_esi_recovery(em_context *ctx);
int em_esi_check_meta(const uint8_t *esi);
void em_esi_write_meta(em_esi_meta *meta, uint8_t *esi);
void em_esi_read_meta(em_esi_meta *meta, uint8_t *esi);
void em_esi_read_tuc_table(tuc_table *table, uint8_t *raw_data);
void em_esi_read_tuc_table_v20(tuc_table_v20 *table, uint8_t *raw_data);
#endif
