package com.spot.enums;

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

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

    /**
     * 1 - 减半：与减半事件相关的币种（如比特币减半周期）
     */
    HALVING(1,
            "减半", "減半", "Halving",
            "반감기", "半減期", "Halbierung",
            "Réduction de moitié", "Dimezzamento", "Reducción a la mitad"),

    /**
     * 2 - 上新：近期新上线的交易对
     */
    NEW_LISTING(2,
            "上新", "上新", "New Listing",
            "신규 상장", "新規上場", "Neu gelistet",
            "Nouvelle cotation", "Nuova quotazione", "Nueva cotización"),

    /**
     * 3 - 热门：当前市场热门、交易量高的交易对
     */
    HOT(3,
            "热门", "熱門", "Hot",
            "인기", "ホット", "Beliebt",
            "Populaire", "Popolare", "Popular"),

    /**
     * 4 - ETF：ETF 类型交易对
     */
    ETF(4,
            "ETF", "ETF", "ETF",
            "ETF", "ETF", "ETF",
            "ETF", "ETF", "ETF");

    /** 标签码（config_symbol.label 字段存储该值的字符串形式，NULL 或空表示无标签） */
    private final int code;

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

    SymbolTagEnum(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.label 存储的数值一致）
     */
    public int getCode() {
        return code;
    }

    /** 获取 label 字段的存储值（字符串形式的标签码） */
    public String getCodeStr() {
        return String.valueOf(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 SymbolTagEnum fromCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (SymbolTagEnum tag : values()) {
            if (tag.code == code) {
                return tag;
            }
        }
        return null;
    }

    /**
     * 根据标签码字符串获取枚举，null 或空字符串返回 null（表示无标签）。
     * 先按 {@link #getCodeStr()} 精确匹配，再尝试解析为整数。
     *
     * @param codeStr 标签码字符串（如 "1"）
     * @return 枚举值，不存在返回 null
     */
    public static SymbolTagEnum fromCodeStr(String codeStr) {
        if (codeStr == null || codeStr.trim().isEmpty()) {
            return null;
        }
        String t = codeStr.trim();
        for (SymbolTagEnum tag : values()) {
            if (tag.getCodeStr().equals(t)) {
                return tag;
            }
        }
        try {
            return fromCode(Integer.parseInt(t));
        } catch (NumberFormatException e) {
            return null;
        }
    }

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