/*
 *
 */

#ifndef AQC_EMVL1_API_H_
#define AQC_EMVL1_API_H_

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
// clang-format off
#define EMVL1_PIPE_NAME_BEEPER "/tmp/aqc.emv.l1.ctls.beeper"
#define EMVL1_PIPE_NAME_LEDS "/tmp/aqc.emv.l1.ctls.leds"
/* It must match to L2 statuses. */
#define EMVL1_STATUS_OK 0
#define EMVL1_STATUS_TIMEOUT -1
#define EMVL1_STATUS_NOT_INITIALIZED -99
#define EMVL1_STATUS_FAILED -8
#define EMVL1_STATUS_NOT_PRESENT -9
#define EMVL1_STATUS_COLLISION_ERROR -13
#define EMVL1_STATUS_PROTOCOL_ERROR -14
#define EMVL1_STATUS_TRANSMISSION_ERROR -15

#define EMVL1_LEDS_STATE_NOT_READY        0x00
#define EMVL1_LEDS_STATE_IDLE             0x01
#define EMVL1_LEDS_STATE_READY_TO_READ    0x02
#define EMVL1_LEDS_STATE_PROCESSING       0x03
#define EMVL1_LEDS_STATE_CR_SUCCESSFULLY  0x04
#define EMVL1_LEDS_STATE_ERROR            0x05

#define EMVL1_BEEP_OK            0x00
#define EMVL1_BEEP_FAIL          0x01

#define SAM_AV1_MODE    0x01U
#define SAM_AV2_MODE    0x02U

#define SAM_AUTH_MODE_PLAIN  0x00U
#define SAM_AUTH_MODE_CMAC   0x01U
#define SAM_AUTH_MODE_FULL   0x02U

#define SAM_KEY_TYPE_AES128    0x00U /**< AES 128 Key [16 Bytes]. */
#define SAM_KEY_TYPE_AES192    0x01U /**< AES 192 Key [24 Bytes]. */
#define SAM_KEY_TYPE_AES256    0x02U /**< AES 256 Key [32 Bytes]. */
#define SAM_KEY_TYPE_DES       0x03U /**< DES Single Key [8 Bytes].   */
#define SAM_KEY_TYPE_2K3DES    0x04U /**< 2 Key Triple Des [16 Bytes]. */
#define SAM_KEY_TYPE_3K3DES    0x05U /**< 3 Key Triple Des [24 Bytes]. */
#define SAM_KEY_TYPE_MIFARE    0x06U /**< MIFARE product Key. */

#define SRI_PAGE_SIZE 4U /**< Size of SRI page */

#ifdef __cplusplus
extern "C"
#endif
uint32_t contactless_getversion();

#ifdef __cplusplus
extern "C"
#endif
void contactless_set_log_level(uint8_t log_level);

#ifdef __cplusplus
extern "C"
#endif
int contactless_open ();

#ifdef __cplusplus
extern "C"
#endif
int contactless_close ();

#ifdef __cplusplus
extern "C"
#endif
int contactless_probe ();

#ifdef __cplusplus
extern "C"
#endif
int contactless_poweron ();

#ifdef __cplusplus
extern "C"
#endif
int contactless_poweroff ();

#ifdef __cplusplus
extern "C"
#endif
int contactless_apdu (uint8_t* com_buffer, uint32_t cmdsize, uint8_t *resp_buffer, uint32_t* wRxLength);

#ifdef __cplusplus
extern "C"
#endif
int contactless_start ();

#ifdef __cplusplus
extern "C"
#endif
int contactless_stop (uint32_t timeout);

#ifdef __cplusplus
extern "C"
#endif
int contactless_beep(bool ok);

#ifdef __cplusplus
extern "C"
#endif
int contactless_setled(int mode);


//-----------------------------MIFARE---------------------------
#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_probe(uint8_t *output);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_reprobe (uint8_t* output);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_auth(uint8_t block_no, char key_type, uint16_t key_number, uint16_t key_version, uint8_t* uid, uint8_t uid_length);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_auth_key(uint8_t block_no, char key_type, uint8_t* key, uint8_t* uid, uint8_t uid_length);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_read_block(uint8_t block_no, uint8_t* block_data);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_write_block(uint8_t block_no, uint8_t* block_data);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_read_value(uint8_t block_no, uint32_t* value, uint8_t* addr);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_write_value(uint8_t block_no, uint32_t value, uint8_t addr);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_operate(char type, uint8_t block_no, uint32_t value, uint8_t update_block_no);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_restore_transfer(uint8_t block_no, uint8_t update_block_no);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareul_auth_pwd(uint8_t* pwd, uint8_t* pack);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareul_read(uint8_t page, uint8_t* data);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareul_write(uint8_t page, uint8_t* data);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareul_read_sign(uint8_t page, uint8_t* data);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareul_read_cnt(uint8_t cnt_n, uint32_t* cnt_value);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareul_inc_cnt(uint8_t cnt_n, uint32_t inc_value);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifareulc_auth(uint16_t key_n, uint16_t key_v);

//-----------------------------SAMAV2---------------------------
#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_sam_set_host_key(uint8_t* key, uint8_t key_nmb, uint8_t key_type, uint8_t key_pos, uint8_t key_ver);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_sam_enable(uint8_t port, uint8_t auth_type, uint8_t host_key_nmb, uint8_t host_key_ver, uint8_t sam_key_nmb, uint8_t sam_key_ver);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_sam_disable();

#ifdef __cplusplus
extern "C"
#endif
int contactless_get_peer_info (uint8_t param, uint8_t* output);

#ifdef __cplusplus
extern "C"
#endif
int contactless_mifare_sam_get_apdu_count ();

//-----------------------------SRI---------------------------
#ifdef __cplusplus
extern "C"
#endif
int contactless_sri_probe (uint8_t* output);
#ifdef __cplusplus
extern "C"
#endif
int contactless_sri_halt (void);
#ifdef __cplusplus
extern "C"
#endif
int contactless_sri_read (const uint8_t page_number, const uint8_t page_count, uint8_t *buffer, const size_t buffer_size, size_t* pg_rd);
#ifdef __cplusplus
extern "C"
#endif
int contactless_sri_write (const uint8_t page_number, const uint8_t page_count, const uint8_t *buffer, const size_t buffer_size, size_t* pg_wr);
#endif /* AQC_EMVL1_API_H_ */
