package com.sunyard.chsm.sdf.context;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Arrays;
import java.util.Objects;

/**
 * @author liulu
 * @since 2024/12/7
 */
@Getter
@RequiredArgsConstructor
public enum SdrCode {

    SDR_OK(0x0, "操作成功"),
    SDR_BASE(0x01000000, "错误码基础值"),

    SDR_UNKNOWER(SDR_BASE.code + 0x00000001, "未知错误"),
    SDR_NOTSUPPORT(SDR_BASE.code + 0x00000002, "不支持的接口调用"),
    SDR_COMMFAIL(SDR_BASE.code + 0x00000003, "与设备通信失败"),
    SDR_HARDFAIL(SDR_BASE.code + 0x00000004, "运算模块无响应"),
    SDR_OPENDEVICE(SDR_BASE.code + 0x00000005, "打开设备失败"),
    SDR_OPENSESSION(SDR_BASE.code + 0x00000006, "创建会话失败"),
    SDR_PARDENY(SDR_BASE.code + 0x00000007, "无私钥使用权限"),
    SDR_KEYNOTEXIST(SDR_BASE.code + 0x00000008, "不存在的密钥调用"),
    SDR_ALGNOTSUPPORT(SDR_BASE.code + 0x00000009, "不支持的算法调用"),
    SDR_ALGMODNOTSUPPORT(SDR_BASE.code + 0x0000000A, "不支持的算法模式调用"),
    SDR_PKOPERR(SDR_BASE.code + 0x0000000B, "公钥运算失败"),
    SDR_SKOPERR(SDR_BASE.code + 0x0000000C, "私钥运算失败"),
    SDR_SIGNERR(SDR_BASE.code + 0x0000000D, "签名运算失败"),
    SDR_VERIFYERR(SDR_BASE.code + 0x0000000E, "验证签名失败"),
    SDR_SYMOPERR(SDR_BASE.code + 0x0000000F, "对称算法运算失败"),
    SDR_STEPERR(SDR_BASE.code + 0x00000010, "多步运算步骤错误"),
    SDR_FILESIZEERR(SDR_BASE.code + 0x00000011, "文件长度超出限制"),
    SDR_FILENOEXIST(SDR_BASE.code + 0x00000012, "指定的文件不存在"),
    SDR_FILEOFSERR(SDR_BASE.code + 0x00000013, "文件起始位置错误"),
    SDR_KEYTYPEERR(SDR_BASE.code + 0x00000014, "密钥类型错误"),
    SDR_KEYERR(SDR_BASE.code + 0x00000015, "密钥错误"),
    SDR_ENCDATAERR(SDR_BASE.code + 0x00000016, "ECC加密数据错误"),
    SDR_RANDERR(SDR_BASE.code + 0x00000017, "随机数产生失败"),
    SDR_PRKERR(SDR_BASE.code + 0x00000018, "私钥使用权限获取失败"),
    SDR_MACERR(SDR_BASE.code + 0x00000019, "MAC运算失败"),
    SDR_FILEEXISTS(SDR_BASE.code + 0x0000001A, "指定文件已存在"),
    SDR_FILEWERR(SDR_BASE.code + 0x0000001B, "文件写入失败"),
    SDR_NOBUFFER(SDR_BASE.code + 0x0000001C, "存储空间不足"),
    SDR_INARGERR(SDR_BASE.code + 0x0000001D, "输入参数错误"),
    SDR_OUTARGERR(SDR_BASE.code + 0x0000001E, "输出参数错误"),
    SDR_FILERDERR(SDR_BASE.code + 0x0000001F, "文件读取失败"),
    SDR_CONSULTERR(SDR_BASE.code + 0x00000020, "密钥协商错误"),
    SDR_LEVELERR(SDR_BASE.code + 0x00000021, "权限不足"),
    SDR_INDEXERR(SDR_BASE.code + 0x00000022, "索引错误"),
    SDR_KEYLENERR(SDR_BASE.code + 0x00000023, "密钥长度错误"),
    SDR_DATALENERR(SDR_BASE.code + 0x00000024, "数据长度错误"),
    SDR_RIGHTLENERR(SDR_BASE.code + 0x00000025, "私钥授权码长度错误"),
    SDR_RIGHTERR(SDR_BASE.code + 0x00000026, "私钥授权码错误"),
    SDR_FILEEMPTYERR(SDR_BASE.code + 0x00000027, "文件为空"),
    SDR_ERRSTATE(SDR_BASE.code + 0x00000028, "处于错误状态"),
    SDR_INITSTATE(SDR_BASE.code + 0x00000029, "处于初始状态"),
    SDR_RPRKERR(SDR_BASE.code + 0x0000002A, "私钥使用权限释放失败"),
    SDR_SIGNPRKERR(SDR_BASE.code + 0x0000002B, "签名公钥导出失败"),
    SDR_ENCPRKERR(SDR_BASE.code + 0x0000002C, "加密公钥导出失败"),
    SDR_KPERR(SDR_BASE.code + 0x0000002D, "密钥对生成失败"),
    SDR_GENERATEKEYERR(SDR_BASE.code + 0x0000002E, "会话密钥生成失败"),
    SDR_IMKEYERR(SDR_BASE.code + 0x0000002F, "导入密钥失败"),
    SDR_INTOEXERR(SDR_BASE.code + 0x00000030, "数字信封转换失败"),

    /* API新增错误码 */
    SRD_DEV_FILE_CONFIG_ERR(SDR_BASE.code + 0x00000040, "配置文件信息错误（请检查配置文件的信息是否有误）"),
    SDR_DEVICEHANDLE_INVAILD(SDR_BASE.code + 0x00000041, "设备句柄错误（请检查句柄是否初始化或已经被释放）"),
    SDR_SESSIONHANLE_INVAILD(SDR_BASE.code + 0x00000042, "会话句柄错误（请检查句柄是否初始化或已经被释放）"),
    SDR_KEYHANLE_INVAILD(SDR_BASE.code + 0x00000043, "密钥句柄错误（请检查句柄是否初始化或已经被释放）"),
    SDR_AGREEMENTHANLE_INVAILD(SDR_BASE.code + 0x00000044, "协商句柄错误（请检查句柄是否初始化或已经被释放）"),
    SDR_UNKNOWN_HANDLE(SDR_BASE.code + 0x00000045, "未知的句柄"),
    SDR_NO_AVAILABL_DEVICE(SDR_BASE.code + 0x00000046, "此设备无法连接, 请检查IP和端口是否正确"),


    SYD_KEYSCHEMEERR(0x26, "错误密钥方案"),
    SYD_PRIKEYPWDERR(0x02, "私钥授权码验证错误"),
    SYD_HASHERR(0x29, "哈希失败（请联系管理员）"),
    SYD_CARDERR(0x47, "密码卡计算错误（请联系管理员）"),
    SYD_PACKAGELENERR(0x80, "数据包长度错误（请联系管理员）"),
    SYD_GETKEYERR(0x21, "获取密钥失败，检查密钥状态"),
    SYD_LMKCALCERR(0x13, "主密钥计算失败（请联系管理员）"),
    SYD_PKGPARAMERR(0x15, "输入参数错误（请联系管理员）"),
    SYD_AGREEMENTERR(0x06, "ECC密钥协商失败（请联系管理员）"),
    SYD_LMKDECPRIKEYERR(0x18, "主密钥解密私钥错误（请联系管理员）"),
    SYD_SYMENCDECERR(0x14, "对称加解密错误（请联系管理员）"),
    SYD_FILEEXISTS(0x71, "文件已存在"),
    SYD_FILENOEXIST(0x72, "文件不存在"),
    SYD_FILECREATEERR(0x73, "文件创建失败（请联系管理员）"),
    SYD_FILERDERR(0x74, "文件读取失败"),
    SYD_FILEWERR(0x75, "文件写入失败"),
    SYD_FILEDELEERR(0x76, "文件删除失败（请联系管理员）"),
    SYD_FILESIZEERR(0x77, "超出文件大小限制"),
    SYD_FILEOPENEERR(0x78, "文件打开失败（请联系管理员）"),
    SYD_FILEEMPTYERR(0x79, "文件为空"),
    SYD_VERIFYERR(0x8002, "验签错误"),

    ;

    private final int code;
    private final String msg;

    public static SdrCode of(int code) {

        return Arrays.stream(SdrCode.values())
                .filter(it -> Objects.equals(it.code, code))
                .findFirst()
                .orElse(null);
    }

}
