package com.market.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.market.entity.Kline;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 现货 K 线数据 Mapper（使用 spot_kline 数据源）
 *
 * @author system
 * @date 2026-05-07
 */
@Mapper
@DS("market")
public interface SpotKlineMapper extends BaseMapper<Kline> {

    /**
     * 查询指定周期和时间范围的 K 线数据
     *
     * @param tableName 表名（如：kline_btcusdt）
     * @param period    周期
     * @param startTime 开始时间（毫秒，可为 null）
     * @param endTime   结束时间（毫秒，可为 null）
     * @param limit     限制条数
     * @return K 线列表
     */
    List<Kline> selectByPeriodAndTimeRange(
            @Param("tableName") String tableName,
            @Param("period") String period,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime,
            @Param("limit") Integer limit
    );

    /**
     * 按周期和开始时间查询单条 K 线（写入前去重）
     *
     * @param tableName 表名
     * @param period    周期
     * @param beginTime 开始时间（毫秒）
     * @return 已存在的记录，不存在返回 null
     */
    Kline selectByPeriodAndBeginTime(
            @Param("tableName") String tableName,
            @Param("period") String period,
            @Param("beginTime") Long beginTime
    );

    /**
     * 插入 K 线
     *
     * @param tableName 表名
     * @param kline     K 线数据
     * @return 影响行数
     */
    int insertKline(@Param("tableName") String tableName, @Param("kline") Kline kline);

    /**
     * 更新 K 线
     *
     * @param tableName 表名
     * @param kline     K 线数据（含 id）
     * @return 影响行数
     */
    int updateKline(@Param("tableName") String tableName, @Param("kline") Kline kline);

    /**
     * 检查表是否存在
     *
     * @param tableName 表名
     * @return 0=不存在，1=存在
     */
    int checkTableExists(@Param("tableName") String tableName);

    /**
     * 创建 K 线表
     *
     * @param tableName 表名
     */
    void createKlineTable(@Param("tableName") String tableName);

    /**
     * 按 beginTimes 批量查询（用于同步去重）
     *
     * @param tableName   表名
     * @param period      周期
     * @param beginTimes  开始时间列表
     * @return 已存在记录列表
     */
    List<Kline> selectByBeginTimes(
            @Param("tableName") String tableName,
            @Param("period") String period,
            @Param("beginTimes") List<Long> beginTimes
    );

    /**
     * 批量插入 K 线
     *
     * @param tableName 表名
     * @param klines    K 线列表
     * @return 影响行数
     */
    int batchInsertKline(@Param("tableName") String tableName, @Param("klines") List<Kline> klines);

    /**
     * 批量更新 K 线（按 period + beginTime 匹配）
     *
     * @param tableName 表名
     * @param klines    K 线列表
     */
    void batchUpdateKline(@Param("tableName") String tableName, @Param("klines") List<Kline> klines);

    /**
     * 按 period + beginTime 直接更新 K 线（无需 id，用于实时同周期写库）
     *
     * @param tableName 表名
     * @param kline     K 线数据（含 period 和 beginTime）
     * @return 影响行数
     */
    int updateKlineByTime(@Param("tableName") String tableName, @Param("kline") Kline kline);
}
