package com.market.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.market.entity.Kline;

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

/**
 * K 线服务：分表管理 + 实时数据处理
 */
public interface KlineService {

    /**
     * 确保 {@code futures_kline_{symbol}} 表存在；
     * 内存已记录的表直接跳过，不再查库。
     */
    void ensureTable(String symbol);

    /**
     * 处理币安推送的 K 线数据
     *
     * <ul>
     *   <li>内存无缓存 → upsert DB，写入内存</li>
     *   <li>同一根线  → 更新内存</li>
     *   <li>新一根线  → upsert 新线到 DB，将新线开盘价赋给上一根的收盘价并更新 DB，替换内存</li>
     * </ul>
     *
     * @param symbol   小写交易对，如 {@code btcusdt}
     * @param interval K 线周期，如 {@code 1m}
     * @param k        币安 kline 事件中的 {@code k} 节点
     */
    void processKline(String symbol, String interval, JsonNode k);

    /**
     * 手动注入价格：将所有已缓存周期的收盘价更新为指定价格，并同步写库
     *
     * @param symbol 小写交易对，如 {@code btcusdt}
     * @param price  注入价格
     */
    void applyManualPrice(String symbol, BigDecimal price);

    /**
     * 查询 K 线历史记录
     *
     * @param symbol   小写交易对，如 {@code btcusdt}
     * @param interval K 线周期，如 {@code 1m}
     * @param from     开始时间（毫秒时间戳，含）
     * @param to       结束时间（毫秒时间戳，含）
     */
    List<Kline> queryHistory(String symbol, String interval, Long from, Long to);
}
