package com.spot.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.spot.entity.ConfigSymbol;
import com.spot.mapper.ConfigSymbolMapper;
import com.spot.service.ConfigSymbolService;
import com.spot.utils.Constant;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 交易对配置服务实现类
 *
 * @author jean
 * @date 2026-05-06
 */
@Service
public class ConfigSymbolServiceImpl extends ServiceImpl<ConfigSymbolMapper, ConfigSymbol> implements ConfigSymbolService {

    /**
     * 获取所有开放交易的交易对
     *
     * @return 开放交易的交易对列表
     */
    @Override
    public List<ConfigSymbol> getOpenSymbols() {
        return list(new LambdaQueryWrapper<ConfigSymbol>()
                .eq(ConfigSymbol::getIsOpen, Constant.IS_OPEN_ENABLED)
                .orderByAsc(ConfigSymbol::getSort));
    }

    /**
     * 获取已开启且已发布的交易对列表
     * 支持按分类和标签过滤，传 null 则不过滤
     *
     * @param category 分类码，null 不过滤
     * @param label    标签码字符串，null 不过滤
     * @return 已发布交易对列表
     */
    @Override
    public List<ConfigSymbol> getPublishedSymbols(Integer category, String label) {
        LambdaQueryWrapper<ConfigSymbol> qw = new LambdaQueryWrapper<ConfigSymbol>()
                .eq(ConfigSymbol::getIsOpen, Constant.IS_OPEN_ENABLED)
                .eq(ConfigSymbol::getPublish, Constant.PUBLISH_ENABLED);
        // 按分类过滤（传 null 不过滤）
        if (category != null) {
            qw.eq(ConfigSymbol::getCategory, category);
        }
        // 按标签过滤（传 null 不过滤）
        if (label != null && !label.trim().isEmpty()) {
            qw.eq(ConfigSymbol::getLabel, label.trim());
        }
        qw.orderByAsc(ConfigSymbol::getSort);
        return list(qw);
    }

    /**
     * 获取指定交易对配置（先查缓存，缓存未命中再查库）
     *
     * @param symbol 交易对符号
     * @return 交易对配置
     */
    @Override
    public ConfigSymbol getConfigSymbol(String symbol) {
        ConfigSymbol cached = Constant.SYMBOL_CONFIG_CACHE.getIfPresent(symbol);
        if (cached != null) {
            return cached;
        }
        ConfigSymbol config = getOne(new LambdaQueryWrapper<ConfigSymbol>()
                .eq(ConfigSymbol::getSymbol, symbol)
                .last(" LIMIT 1"));
        if (config != null) {
            Constant.SYMBOL_CONFIG_CACHE.put(symbol, config);
        }
        return config;
    }

    @Override
    public List<ConfigSymbol> getAllSymbols() {
        return list(new LambdaQueryWrapper<ConfigSymbol>()
                .orderByAsc(ConfigSymbol::getSort));
    }
}
