package com.spot.enums;

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

/**
 * 交易对分类枚举，内嵌9种语言翻译。
 * 对应 config_symbol.category 字段（NULL 表示未分类）。
 * 内部 Map 键为去分隔符大写形式：ZHCN、ZHHK、ENUS 等，见 {@link I18nLangKeys}。
 *
 * @author jean
 * @date 2026-05-10
 */
public enum SymbolCategoryEnum {

    /**
     * 1 - 主流币：市值排名靠前、流动性好的主流加密货币
     */
    MAINSTREAM(1,
            "主流币", "主流幣", "Mainstream",
            "주류 코인", "メインストリーム", "Mainstream",
            "Principal", "Principale", "Principal"),

    /**
     * 2 - 创新区：具有创新潜力的新兴项目交易对
     */
    INNOVATION(2,
            "创新区", "創新區", "Innovation",
            "혁신 구역", "イノベーション", "Innovation",
            "Innovation", "Innovazione", "Innovación"),

    /**
     * 3 - 新币：近期新上线的币种
     */
    NEW_COIN(3,
            "新币", "新幣", "New Coin",
            "신규 코인", "新コイン", "Neue Münze",
            "Nouvelle monnaie", "Nuova moneta", "Nueva moneda"),

    /**
     * 4 - 观察区：流动性或风险需持续关注的交易对
     */
    WATCHLIST(4,
            "观察区", "觀察區", "Watchlist",
            "관찰 구역", "ウォッチリスト", "Beobachtungsliste",
            "Liste de surveillance", "Lista di sorveglianza", "Lista de vigilancia");

    /** 分类码（数据库存储值，NULL 表示未分类） */
    private final int code;

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

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

    /**
     * @return 分类码（与数据库 config_symbol.category 一致）
     */
    public int getCode() {
        return code;
    }

    /**
     * 根据语言标识获取分类描述；先将 lang 规范化（见 {@link I18nLangKeys#normalize(String)}）再查表，不匹配时降级为中文简体。
     *
     * @param lang 语言标识（如 zh_CN、zh-CN、en_US）
     * @return 分类描述文本
     */
    public String getDesc(String lang) {
        String key = I18nLangKeys.normalize(lang);
        String desc = descs.get(key);
        return desc != null ? desc : descs.get(I18nLangKeys.DEFAULT);
    }

    /**
     * 根据分类码获取枚举，code 为 null 或无匹配时返回 null（表示未分类）
     *
     * @param code 分类码
     * @return 枚举值，不存在返回 null
     */
    public static SymbolCategoryEnum fromCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (SymbolCategoryEnum category : values()) {
            if (category.code == code) {
                return category;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return String.format("%s(%d)", descs.get(I18nLangKeys.DEFAULT), code);
    }
}
