package com.spot.enums;

import java.util.HashMap;
import java.util.Map;

/**
 * 接口响应码枚举，内嵌9种语言翻译。
 * 内部 Map 键为去分隔符大写形式：ZHCN、ZHHK、ENUS、KOKR、JAJP、DEDE、FRFR、ITIT、ESES。
 * 请求传入 {@code zh-CN}、{@code zh_CN} 等经 {@link I18nLangKeys#normalize(String)} 后查找；不匹配时降级为中文简体（{@link I18nLangKeys#DEFAULT}）。
 *
 * @author jean
 * @date 2026-05-06
 */
public enum MessageCode {

    /**
     * 成功
     */
    SUCCESS("0",
            "成功", "成功", "Success",
            "성공", "成功", "Erfolg",
            "Succès", "Successo", "Éxito"),

    /**
     * 失败
     */
    FAIL("1",
            "失败", "失敗", "Failed",
            "실패", "失敗", "Fehlgeschlagen",
            "Échoué", "Fallito", "Fallido"),

    /**
     * 参数错误
     */
    PARAMETER_ERROR("10001",
            "参数错误", "參數錯誤", "Parameter error",
            "매개변수 오류", "パラメータエラー", "Parameterfehler",
            "Erreur de paramètre", "Errore parametro", "Error de parámetro"),

    /**
     * 系统异常
     */
    UNKNOWN_ERROR("10002",
            "系统异常", "系統異常", "System error",
            "시스템 오류", "システムエラー", "Systemfehler",
            "Erreur système", "Errore di sistema", "Error del sistema"),

    /**
     * 无数据
     */
    NO_DATA("10003",
            "暂无数据", "暫無數據", "No data",
            "데이터 없음", "データなし", "Keine Daten",
            "Aucune donnée", "Nessun dato", "Sin datos"),

    /**
     * 验证失败
     */
    VERIFICATION_FAILED("10004",
            "验证失败", "驗證失敗", "Verification failed",
            "인증 실패", "認証失敗", "Verifizierung fehlgeschlagen",
            "Vérification échouée", "Verifica fallita", "Verificación fallida"),

    /**
     * 参数绑定错误
     */
    PARAMETER_BINDING_ERROR("10005",
            "参数绑定错误", "參數綁定錯誤", "Parameter binding error",
            "매개변수 바인딩 오류", "パラメータバインドエラー", "Parameterbindungsfehler",
            "Erreur de liaison de paramètre", "Errore di binding del parametro", "Error de vinculación de parámetro"),

    /**
     * 用户未登录
     */
    USER_NOT_LOGIN("10006",
            "用户未登录", "用戶未登錄", "User not logged in",
            "사용자 로그인 필요", "ログインが必要です", "Benutzer nicht angemeldet",
            "Utilisateur non connecté", "Utente non connesso", "Usuario no conectado"),

    /**
     * 获取成功
     */
    GET_SUCCESS("0",
            "获取成功", "獲取成功", "Get success",
            "조회 성공", "取得成功", "Erfolgreich abgerufen",
            "Récupération réussie", "Recupero riuscito", "Obtención exitosa"),

    /**
     * 下单失败
     */
    CREATE_ORDER_FAIL("20001",
            "下单失败", "下單失敗", "Order creation failed",
            "주문 생성 실패", "注文作成失敗", "Auftragsanlage fehlgeschlagen",
            "Création de commande échouée", "Creazione ordine fallita", "Creación de orden fallida"),

    /**
     * 系统异常-订单
     */
    ORDER_SYSTEM_ERROR("20002",
            "系统异常，请稍后重试", "系統異常，請稍後重試", "System error, please try again later",
            "시스템 오류, 잠시 후 다시 시도해 주세요", "システムエラー、後でもう一度お試しください", "Systemfehler, bitte versuchen Sie es später erneut",
            "Erreur système, veuillez réessayer plus tard", "Errore di sistema, riprovare più tardi", "Error del sistema, inténtelo más tarde"),

    /**
     * 撤单失败
     */
    CANCEL_ORDER_FAIL("20003",
            "撤单失败", "撤單失敗", "Order cancellation failed",
            "주문 취소 실패", "注文キャンセル失敗", "Auftragsabbruch fehlgeschlagen",
            "Annulation de commande échouée", "Cancellazione ordine fallita", "Cancelación de orden fallida"),

    /**
     * 网络异常
     */
    NETWORK_ABNORMALITY("30001",
            "网络异常，请稍后重试", "網絡異常，請稍後重試", "Network error, please try again later",
            "네트워크 오류, 잠시 후 다시 시도해 주세요", "ネットワークエラー、後でもう一度お試しください", "Netzwerkfehler, bitte versuchen Sie es später erneut",
            "Erreur réseau, veuillez réessayer plus tard", "Errore di rete, riprovare più tardi", "Error de red, inténtelo más tarde"),

    // ==================== 划转相关错误码 ====================

    /**
     * 划转金额无效（必须大于0）
     */
    TRANSFER_AMOUNT_INVALID("40001",
            "划转金额必须大于0", "劃轉金額必須大於0", "Transfer amount must be greater than 0",
            "이체 금액은 0보다 커야 합니다", "振替金額は0より大きくなければなりません", "Überweisungsbetrag muss größer als 0 sein",
            "Le montant du transfert doit être supérieur à 0", "L'importo del trasferimento deve essere maggiore di 0", "El monto de transferencia debe ser mayor que 0"),

    /**
     * 余额不足
     */
    INSUFFICIENT_BALANCE("40002",
            "余额不足", "餘額不足", "Insufficient balance",
            "잔액 부족", "残高不足", "Unzureichendes Guthaben",
            "Solde insuffisant", "Saldo insufficiente", "Saldo insuficiente"),

    /**
     * 资金钱包不存在
     */
    WALLET_NOT_FOUND("40003",
            "资金钱包不存在", "資金錢包不存在", "Fund wallet not found",
            "자금 지갑을 찾을 수 없습니다", "資金ウォレットが存在しません", "Geldbörse nicht gefunden",
            "Portefeuille introuvable", "Portafoglio non trovato", "Billetera no encontrada"),

    /**
     * 资金钱包已锁定
     */
    WALLET_LOCKED("40004",
            "资金钱包已锁定，无法操作", "資金錢包已鎖定，無法操作", "Fund wallet is locked",
            "자금 지갑이 잠겨 있습니다", "資金ウォレットがロックされています", "Geldbörse ist gesperrt",
            "Le portefeuille est verrouillé", "Il portafoglio è bloccato", "La billetera está bloqueada"),

    /**
     * 现货账户不存在
     */
    SPOT_ACCOUNT_NOT_FOUND("40005",
            "现货账户不存在", "現貨帳戶不存在", "Spot account not found",
            "현물 계좌를 찾을 수 없습니다", "現物口座が存在しません", "Spot-Konto nicht gefunden",
            "Compte spot introuvable", "Conto spot non trovato", "Cuenta spot no encontrada"),

    /**
     * 币种未开放（不在现货开启币种列表中，或已被禁用）
     */
    COIN_SYMBOL_NOT_OPEN("40006",
            "该币种暂不支持划转", "該幣種暫不支援劃轉", "This coin is not available for transfer",
            "이 코인은 이체를 지원하지 않습니다", "この通貨は振替をサポートしていません", "Diese Münze unterstützt keine Überweisungen",
            "Cette monnaie ne supporte pas les transferts", "Questa moneta non supporta i trasferimenti", "Esta moneda no admite transferencias"),

    /**
     * 划转方向无效
     */
    TRANSFER_DIRECTION_INVALID("40007",
            "划转方向无效", "劃轉方向無效", "Invalid transfer direction",
            "유효하지 않은 이체 방향", "無効な振替方向", "Ungültige Überweisungsrichtung",
            "Direction de transfert invalide", "Direzione di trasferimento non valida", "Dirección de transferencia no válida"),

    /**
     * 划转失败
     */
    TRANSFER_FAILED("40008",
            "划转失败，请稍后重试", "劃轉失敗，請稍後重試", "Transfer failed, please try again later",
            "이체 실패, 잠시 후 다시 시도해 주세요", "振替に失敗しました。後でもう一度お試しください", "Überweisung fehlgeschlagen, bitte versuchen Sie es später erneut",
            "Transfert échoué, veuillez réessayer plus tard", "Trasferimento fallito, riprovare più tardi", "Transferencia fallida, inténtelo más tarde"),

    // ==================== 订单参数校验错误码 ====================

    /**
     * 交易对不能为空
     */
    SYMBOL_EMPTY("50001",
            "交易对不能为空", "交易對不能為空", "Symbol cannot be empty",
            "거래쌍을 입력해 주세요", "取引ペアを入力してください", "Symbol darf nicht leer sein",
            "Le symbole ne peut pas être vide", "Il simbolo non può essere vuoto", "El símbolo no puede estar vacío"),

    /**
     * 买卖方向不能为空
     */
    ORDER_SIDE_EMPTY("50002",
            "买卖方向不能为空", "買賣方向不能為空", "Order side cannot be empty",
            "매수/매도 방향을 입력해 주세요", "売買方向を入力してください", "Orderseite darf nicht leer sein",
            "Le sens de l'ordre ne peut pas être vide", "Il lato dell'ordine non può essere vuoto", "El lado de la orden no puede estar vacío"),

    /**
     * 未知的买卖方向：{0} 为方向码
     */
    ORDER_SIDE_UNKNOWN("50003",
            "未知的买卖方向: {0}", "未知的買賣方向: {0}", "Unknown order side: {0}",
            "알 수 없는 매수/매도 방향: {0}", "不明な売買方向: {0}", "Unbekannte Orderseite: {0}",
            "Sens d'ordre inconnu: {0}", "Lato ordine sconosciuto: {0}", "Lado de orden desconocido: {0}"),

    /**
     * 订单类型不能为空
     */
    ORDER_TYPE_EMPTY("50004",
            "订单类型不能为空", "訂單類型不能為空", "Order type cannot be empty",
            "주문 유형을 입력해 주세요", "注文タイプを入力してください", "Ordertyp darf nicht leer sein",
            "Le type d'ordre ne peut pas être vide", "Il tipo di ordine non può essere vuoto", "El tipo de orden no puede estar vacío"),

    /**
     * 未知的订单类型：{0} 为类型码
     */
    ORDER_TYPE_UNKNOWN("50005",
            "未知的订单类型: {0}", "未知的訂單類型: {0}", "Unknown order type: {0}",
            "알 수 없는 주문 유형: {0}", "不明な注文タイプ: {0}", "Unbekannter Ordertyp: {0}",
            "Type d'ordre inconnu: {0}", "Tipo di ordine sconosciuto: {0}", "Tipo de orden desconocido: {0}"),

    /**
     * 订单数量必须大于0
     */
    ORDER_VOLUME_INVALID("50006",
            "订单数量必须大于0", "訂單數量必須大於0", "Order quantity must be greater than 0",
            "주문 수량은 0보다 커야 합니다", "注文数量は0より大きくなければなりません", "Bestellmenge muss größer als 0 sein",
            "La quantité de la commande doit être supérieure à 0", "La quantità dell'ordine deve essere maggiore di 0", "La cantidad de la orden debe ser mayor que 0"),

    /**
     * 限价单价格必须大于0
     */
    LIMIT_ORDER_PRICE_INVALID("50007",
            "限价单价格必须大于0", "限價單價格必須大於0", "Limit order price must be greater than 0",
            "지정가 주문 가격은 0보다 커야 합니다", "指値注文の価格は0より大きくなければなりません", "Limitorder-Preis muss größer als 0 sein",
            "Le prix de l'ordre limité doit être supérieur à 0", "Il prezzo dell'ordine limite deve essere maggiore di 0", "El precio de la orden limitada debe ser mayor que 0"),

    /**
     * 交易对不存在：{0} 为交易对符号
     */
    SYMBOL_NOT_FOUND("50008",
            "交易对不存在: {0}", "交易對不存在: {0}", "Symbol not found: {0}",
            "거래쌍을 찾을 수 없습니다: {0}", "取引ペアが存在しません: {0}", "Symbol nicht gefunden: {0}",
            "Symbole introuvable: {0}", "Simbolo non trovato: {0}", "Símbolo no encontrado: {0}"),

    /**
     * 交易对未开放：{0} 为交易对符号
     */
    SYMBOL_NOT_OPEN("50009",
            "交易对未开放: {0}", "交易對未開放: {0}", "Symbol not available: {0}",
            "거래쌍이 비활성화 상태입니다: {0}", "取引ペアは利用できません: {0}", "Symbol nicht verfügbar: {0}",
            "Symbole non disponible: {0}", "Simbolo non disponibile: {0}", "Símbolo no disponible: {0}"),

    /**
     * 限价单价格低于最小限制：{0} 为最小价格
     */
    LIMIT_PRICE_TOO_LOW("50010",
            "限价单价格低于最小限制: {0}", "限價單價格低於最小限制: {0}", "Limit order price below minimum: {0}",
            "지정가 주문 가격이 최소 한도보다 낮습니다: {0}", "指値注文の価格が最小制限を下回っています: {0}", "Limitorder-Preis unter Minimum: {0}",
            "Prix de l'ordre limité inférieur au minimum: {0}", "Prezzo ordine limite inferiore al minimo: {0}", "Precio de orden limitada inferior al mínimo: {0}"),

    /**
     * 限价单数量低于最小限制：{0} 为最小数量
     */
    LIMIT_VOLUME_TOO_LOW("50011",
            "限价单数量低于最小限制: {0}", "限價單數量低於最小限制: {0}", "Limit order quantity below minimum: {0}",
            "지정가 주문 수량이 최소 한도보다 낮습니다: {0}", "指値注文の数量が最小制限を下回っています: {0}", "Limitorder-Menge unter Minimum: {0}",
            "Quantité de l'ordre limité inférieure au minimum: {0}", "Quantità ordine limite inferiore al minimo: {0}", "Cantidad de orden limitada inferior al mínimo: {0}"),

    /**
     * 市价买单数量低于最小限制：{0} 为最小数量
     */
    MARKET_BUY_VOLUME_TOO_LOW("50012",
            "市价买单数量低于最小限制: {0}", "市價買單數量低於最小限制: {0}", "Market buy quantity below minimum: {0}",
            "시장가 매수 수량이 최소 한도보다 낮습니다: {0}", "成行買い注文の数量が最小制限を下回っています: {0}", "Marktorder-Kaufmenge unter Minimum: {0}",
            "Quantité achat au marché inférieure au minimum: {0}", "Quantità acquisto mercato inferiore al minimo: {0}", "Cantidad compra mercado inferior al mínimo: {0}"),

    /**
     * 市价卖单数量低于最小限制：{0} 为最小数量
     */
    MARKET_SELL_VOLUME_TOO_LOW("50013",
            "市价卖单数量低于最小限制: {0}", "市價賣單數量低於最小限制: {0}", "Market sell quantity below minimum: {0}",
            "시장가 매도 수량이 최소 한도보다 낮습니다: {0}", "成行売り注文の数量が最小制限を下回っています: {0}", "Marktorder-Verkaufsmenge unter Minimum: {0}",
            "Quantité vente au marché inférieure au minimum: {0}", "Quantità vendita mercato inferiore al minimo: {0}", "Cantidad venta mercado inferior al mínimo: {0}"),

    /**
     * 账户余额不足
     */
    ACCOUNT_BALANCE_INSUFFICIENT("50014",
            "账户余额不足", "帳戶餘額不足", "Insufficient account balance",
            "계좌 잔액이 부족합니다", "口座残高が不足しています", "Unzureichendes Kontoguthaben",
            "Solde du compte insuffisant", "Saldo del conto insufficiente", "Saldo de cuenta insuficiente"),

    /**
     * 委托单数量已达上限：{0} 为上限数量
     */
    MAX_ORDERS_PER_USER_EXCEEDED("50015",
            "当前委托单数量已达上限: {0}", "當前委託單數量已達上限: {0}", "Active order limit reached: {0}",
            "활성 주문 한도에 도달했습니다: {0}", "アクティブ注文数の上限に達しました: {0}", "Aktives Auftragslimit erreicht: {0}",
            "Limite des ordres actifs atteinte: {0}", "Limite ordini attivi raggiunto: {0}", "Límite de órdenes activas alcanzado: {0}"),

    /**
     * 单日交易额已达上限：{0} 为上限金额（USDT）
     */
    DAILY_VOLUME_LIMIT_EXCEEDED("50016",
            "今日交易额已达上限: {0} USDT", "今日交易額已達上限: {0} USDT", "Daily trading volume limit reached: {0} USDT",
            "일일 거래량 한도에 도달했습니다: {0} USDT", "本日の取引量上限に達しました: {0} USDT", "Tägliches Handelslimit erreicht: {0} USDT",
            "Limite de volume quotidien atteinte: {0} USDT", "Limite volume giornaliero raggiunto: {0} USDT", "Límite de volumen diario alcanzado: {0} USDT"),

    /**
     * 订单ID不能为空
     */
    ORDER_ID_EMPTY("50017",
            "订单ID不能为空", "訂單ID不能為空", "Order ID cannot be empty",
            "주문 ID를 입력해 주세요", "注文IDを入力してください", "Auftrags-ID darf nicht leer sein",
            "L'identifiant de l'ordre ne peut pas être vide", "L'ID dell'ordine non può essere vuoto", "El ID de la orden no puede estar vacío"),

    /**
     * 用户ID不能为空
     */
    USER_ID_EMPTY("50018",
            "用户ID不能为空", "用戶ID不能為空", "User ID cannot be empty",
            "사용자 ID를 입력해 주세요", "ユーザーIDを入力してください", "Benutzer-ID darf nicht leer sein",
            "L'identifiant utilisateur ne peut pas être vide", "L'ID utente non può essere vuoto", "El ID de usuario no puede estar vacío"),

    /**
     * 订单不存在：{0} 为订单ID
     */
    ORDER_NOT_FOUND("50019",
            "订单不存在: {0}", "訂單不存在: {0}", "Order not found: {0}",
            "주문을 찾을 수 없습니다: {0}", "注文が存在しません: {0}", "Auftrag nicht gefunden: {0}",
            "Ordre introuvable: {0}", "Ordine non trovato: {0}", "Orden no encontrada: {0}"),

    /**
     * 无权操作该订单：{0} 为订单ID
     */
    ORDER_NO_PERMISSION("50020",
            "无权操作该订单: {0}", "無權操作該訂單: {0}", "No permission to operate this order: {0}",
            "해당 주문에 대한 권한이 없습니다: {0}", "この注文を操作する権限がありません: {0}", "Keine Berechtigung für diesen Auftrag: {0}",
            "Pas d'autorisation pour cet ordre: {0}", "Nessuna autorizzazione per questo ordine: {0}", "Sin permiso para operar esta orden: {0}"),

    /**
     * 订单状态不允许撤单：{0} 为当前状态描述
     */
    ORDER_CANCEL_STATUS_INVALID("50021",
            "订单状态不允许撤单，当前状态: {0}", "訂單狀態不允許撤單，當前狀態: {0}", "Order cannot be cancelled in current status: {0}",
            "현재 주문 상태에서는 취소할 수 없습니다: {0}", "現在のステータスではキャンセルできません: {0}", "Auftrag kann im aktuellen Status nicht storniert werden: {0}",
            "L'ordre ne peut pas être annulé dans son statut actuel: {0}", "L'ordine non può essere annullato nello stato attuale: {0}", "La orden no puede cancelarse en el estado actual: {0}");

    /** 响应码 */
    private final String code;

    /** 多语言翻译映射：规范化语言键（{@link I18nLangKeys#normalize(String)}）-> 文本 */
    private final Map<String, String> messages;

    MessageCode(String code,
                String zhCN, String zhHK, String enUS,
                String koKR, String jaJP, String deDE,
                String frFR, String itIT, String esES) {
        this.code = code;
        this.messages = new HashMap<>(16);
        this.messages.put("ZHCN", zhCN);
        this.messages.put("ZHHK", zhHK);
        this.messages.put("ENUS", enUS);
        this.messages.put("KOKR", koKR);
        this.messages.put("JAJP", jaJP);
        this.messages.put("DEDE", deDE);
        this.messages.put("FRFR", frFR);
        this.messages.put("ITIT", itIT);
        this.messages.put("ESES", esES);
    }

    /**
     * 获取响应码
     *
     * @return 响应码字符串
     */
    public String getCode() {
        return code;
    }

    /**
     * 根据语言标识获取对应翻译文本。
     * 先将 lang 去掉 {@code -}、{@code _} 后转大写再查表（见 {@link I18nLangKeys#normalize(String)}）；不匹配时降级为中文简体。
     *
     * @param lang 语言标识（如 zh_CN、zh-CN、en_US）
     * @return 翻译文本
     */
    public String getMessage(String lang) {
        String key = I18nLangKeys.normalize(lang);
        String msg = messages.get(key);
        return msg != null ? msg : messages.get(I18nLangKeys.DEFAULT);
    }

    /**
     * 根据语言标识获取翻译文本，并替换模板中的 {0}、{1} 等占位符。
     *
     * @param lang 语言标识（如 zh_CN、en_US）
     * @param args 动态参数，按顺序替换 {0}、{1} 占位符
     * @return 替换后的翻译文本
     */
    public String getMessage(String lang, Object... args) {
        String template = getMessage(lang);
        if (args == null || args.length == 0) {
            return template;
        }
        for (int i = 0; i < args.length; i++) {
            template = template.replace("{" + i + "}", args[i] != null ? args[i].toString() : "");
        }
        return template;
    }

    /**
     * 获取默认语言（中文简体）翻译文本
     *
     * @return 翻译文本
     */
    public String getMessage() {
        return messages.get(I18nLangKeys.DEFAULT);
    }

    /**
     * 获取默认语言（中文简体）翻译文本，并替换占位符。
     *
     * @param args 动态参数
     * @return 替换后的翻译文本
     */
    public String getMessage(Object... args) {
        return getMessage(null, args);
    }
}
