#ifndef __STATUS_CODE_H__
#define __STATUS_CODE_H__

#include "types.h"

#define STATUS_DESC_LEN  128

typedef enum {
    SW_SUCCESS = 0x9000,

    SW_UNKNOWN = 0x6F00,

    SW_WRONG_LENGTH = 0x6700,
    SW_INVALID_CLA = 0x67006E00,
    SW_INVALID_INS = 0x6D00,
    SW_LOGICAL_CHANNEL_NOT_SUPPORTED = 0x6881,
    SW_SECURE_MESSAGE_NOT_SUPPORTED = 0x6882,

    SW_WRONG_PARAMS = 0x6A86,
    SW_WRONG_DATA = 0x6A80,
    SW_FILE_NOT_FOUND = 0x6A82,
    SW_RECORD_NOT_FOUND = 0x6A83,

    SW_SECURITY_NOT_SATISFIED = 0x6982,
    SW_PIN_BLOCKED = 0x698283,
    SW_NO_FILE_SELECTED = 0x6986,

    SW_VERYFY_PIN_RETRY_LEFT_TIME = 0x63C3,
    SW_UNBLOCK_PIN_RETRY_LEFT_TIME = 0x63CA,

    SW_AUTH_INCORRECT_MAC = 0x9862,
    SW_AUTH_CONTEXT_NOT_SUPPORTED = 0x9864
} sw_value_t;

typedef struct{
    union{
        sw_value_t sw;
        struct{
            uint8_t sw1;
            uint8_t sw2;
        };
    };
}sw_status_t;

typedef struct{
    uint8_t sw1;
    uint8_t sw2;
    char desc[STATUS_DESC_LEN];
} status_coding_t;

#define INIT_SW_SUCCESS(name)  \
    sw_status_t name =  {      \
        .sw = SW_SUCCESS,      \
    };

extern status_coding_t status_coding_list[];

extern char *get_desc_of_sw1sw2(uint8_t, uint8_t);

#endif /*__STATUS_CODE_H__*/
