package com.market.service;

import com.market.entity.RobotConfig;
import com.market.model.RobotConfigDTO;

import java.math.BigDecimal;
import java.util.List;
import java.util.function.Function;

/**
 * 行情机器人服务接口
 *
 * @author jean
 * @date 2026-05-11
 */
public interface PriceRobotService {

    /**
     * 获取机器人配置（优先走 Caffeine 缓存，未命中回源 DB）
     *
     * @param symbol 交易对（小写）
     * @return 机器人配置，不存在返回 null
     */
    RobotConfig getConfig(String symbol);

    /**
     * 令指定 symbol 的配置缓存立即失效，下次读取时重新查库
     *
     * @param symbol 交易对（小写）
     */
    void invalidateConfig(String symbol);

    /**
     * 获取当前价格（仅内存缓存，不从 Redis/DB 读取）
     *
     * @param symbol 交易对（小写）
     * @return 当前价格，未生成过则返回 null
     */
    BigDecimal getCurrentPrice(String symbol);

    /**
     * 执行一次价格生成并推送
     *
     * @param symbol 交易对（小写）
     * @param config 当前机器人配置
     */
    void tick(String symbol, RobotConfig config);

    /**
     * 查询所有状态不为 STOPPED 的机器人配置（直接查库）
     *
     * @return 活跃配置列表
     */
    List<RobotConfig> listAllActive();

    /**
     * 查询所有机器人配置（含已停止）
     *
     * @return 全量配置列表
     */
    List<RobotConfig> listAll();

    /**
     * 新增或更新机器人配置（以 symbol 为唯一键）
     *
     * @param dto 配置 DTO
     */
    void save(RobotConfigDTO dto);

    /**
     * 启动机器人：将状态改为 RUNNING
     *
     * @param symbol 交易对（小写）
     */
    void start(String symbol);

    /**
     * 停止机器人：将状态改为 STOPPED
     *
     * @param symbol 交易对（小写）
     */
    void stop(String symbol);

    /**
     * 将 RobotConfig 实体转换为 DTO（含运行时字段）
     *
     * @param config       实体
     * @param threadStatus 线程状态字符串
     * @return DTO
     */
    RobotConfigDTO toDTO(RobotConfig config, String threadStatus);

    /**
     * 批量转换为 DTO 列表
     *
     * @param configs       实体列表
     * @param statusFetcher 根据 symbol 获取线程状态的函数
     * @return DTO 列表
     */
    List<RobotConfigDTO> toDTOList(List<RobotConfig> configs, Function<String, String> statusFetcher);
}
