// error.h
#ifndef ERROR_H
#define ERROR_H

extern "C" {
#include "rnp/rnp_err.h"
}

// Enum for general error codes
enum class ErrorCode {
    Error = 1,  ///< Generic error code
};

// Enum for errors related to showing errors (e.g., password issues, key issues)
enum class ErrorCodeShow {
    UnexpectedError = 1,  ///< Unknown or unexpected error
    BadPassphrase,        ///< Invalid passphrase error
    NoKeyFound,           ///< Key not found error
    DecryptFailed         ///< Decryption failure error
};

/**
* Convert an RNP error code to a corresponding ErrorCodeShow
* @param rnpErrorCode The RNP error code
* @return Corresponding ErrorCodeShow integer value
*/
inline ErrorCodeShow rnpErrorToErrorCodeShow(int rnpErrorCode)
{
    switch (rnpErrorCode) {
    case RNP_ERROR_BAD_PASSWORD:
        return ErrorCodeShow::BadPassphrase;   ///< Bad passphrase error
    case RNP_ERROR_KEY_NOT_FOUND:
    case RNP_ERROR_NO_SUITABLE_KEY:
        return ErrorCodeShow::NoKeyFound;      ///< No key found error
    case RNP_ERROR_DECRYPT_FAILED:
        return ErrorCodeShow::DecryptFailed;    ///< Decryption failure error
    default:
        return ErrorCodeShow::UnexpectedError; ///< Default to unexpected error
    }
}

// Enum for errors related to importing key files
enum class ErrorCodeImportKeyFile {
    UnexpectedError = 1,  ///< Unknown or unexpected error
    BadFormat,            ///< Bad format error when importing the key file
};

/**
* Convert an RNP error code to a corresponding ErrorCodeImportKeyFile
* @param rnpErrorCode The RNP error code
* @return Corresponding ErrorCodeImportKeyFile integer value
*/
inline ErrorCodeImportKeyFile rnpErrorToErrorCodeImportKeyFile(int rnpErrorCode)
{
    switch (rnpErrorCode) {
    case RNP_ERROR_BAD_FORMAT:
        return ErrorCodeImportKeyFile::BadFormat; ///< Bad format error
    default:
        return ErrorCodeImportKeyFile::UnexpectedError; ///< Default to unexpected error
    }
}

#endif // ERROR_H
