#pragma once

#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "crypto/openssl.h"
// #include "base64.h"

#include "settings.h"

// #define CIPHER_COUNT 5
typedef enum {
    CIPHER_SAHE,
    CIPHER_SMHE,

    CIPHER_ORE,
    CIPHER_AES,
    CIPHER_AESHMAC,//for 完整性校验

    CIPHER_SM4, // ECB 模式 
    CIPHER_SM4CK, // ECB+SM3 模式 , 提供完整性审计

    CIPHER_NOCRYPT, // for such 'and', 'or' oprator or column that do not encrypt use
    CIPHER_MAPPED,  // for such 'table', 'column name' use

    CIPHER_DET, // use CIPHER_AES instead since they are the same
    CIPHER_RND,
    CIPHER_RNDSM4CK, // GCM 
    CIPHER_COUNT

} T_Cipher;

const char *typeCipher2String(T_Cipher t);

size_t getCipherBufSize(T_Cipher t);

T_Cipher string2TypeCipher(const char *str);

uint8_t *encryptValue(T_Cipher encryptCipher, uint8_t *in_text, size_t in_size, size_t *out_size, const char *dek, bool isEncrypt = true,
                      bool isFloat = false);

size_t getCipherFormatSize(const char *fmt, T_Cipher t);

// string getAESKey();
