package link.at17.mid.tushare.dao;

import com.alibaba.fastjson2.JSONObject;

import link.at17.mid.tushare.annotation.BatchInsert;
import link.at17.mid.tushare.annotation.BatchList;
import link.at17.mid.tushare.data.models.StockValue;
import link.at17.mid.tushare.data.models.StockValueEx;
import link.at17.mid.tushare.data.models.interfaces.ITsStockInfo;
import link.at17.mid.tushare.enums.StockSpan;

import org.apache.ibatis.annotations.Mapper;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.temporal.Temporal;
import java.util.List;

@Component
@Mapper
public interface StockMinuteDao {
    /**
     * 批量插入/更新日线数据
     * @param list
     */
    @BatchInsert
    int insertOrUpdateList(@BatchList List<JSONObject> list, @NotNull StockSpan stockSpan);

    /**
     * 获取最新交易日<br/>
     * 获取到股票的最新交易日
     * @param stockSpan 分钟线频率
     * @param stockInfo
     * @return
     */
    LocalDateTime getLatestTradeDate(@NotNull StockSpan stockSpan, ITsStockInfo stockInfo);
    /**
     * 获取指定 freq 下的所有交易日
     * @param stockSpan 分钟线频率
     * @param stockInfo
     * @return
     */
    List<LocalDateTime> getAllTradeDates(@NotNull StockSpan stockSpan, ITsStockInfo stockInfo);
    /**
     * 获取指定 freq 下的数据缺失日，包括分钟数据不全日<br/>
     * 如：60 分钟频率下，一日内 K 线数应为 240/60 + 1 = 5 条，则小于 5 条的日期都将被列为缺失日期
     * @param stockSpan 分钟线频率
     * @param stockInfo
     * @return
     */
    List<LocalDateTime> getAllMissingDates(@NotNull StockSpan stockSpan, ITsStockInfo stockInfo);
    /**
     * 获取前复权日线数据
     * @param stockCode 股票代码，不允许为空
     * @param stockSpan 分钟线频率
     * @param startDate 开始日期，留空则为股票上市日起
     * @param endDate 结束日期，留空则为最新一个交易日
     * @return
     */
    List<StockValue> getQfqMinute(@NotNull String stockCode, @NotNull StockSpan stockSpan, Temporal startDate, Temporal endDate);
    /**
     * 获取前复权日线数据
     * @param stockCode 股票代码，不允许为空
     * @param endDate 结束日期，留空则为最新一个交易日
     * @param before 多少个交易日以前，留空则查询上市以来所有数据
     * @return
     */
    List<StockValue> getQfqMinuteBefore(@NotNull String stockCode, @NotNull StockSpan stockSpan, Temporal endDate, Long before);
    /**
     * 获取前复权日线 Ex 数据
     * @param stockCode 股票代码，不允许为空
     * @param endDate 结束日期，留空则为最新一个交易日
     * @param before 多少个交易日以前，留空则查询上市以来所有数据
     * @return
     */
    List<StockValueEx> getExQfqMinuteBefore(@NotNull String stockCode, @NotNull StockSpan stockSpan, Temporal endDate, Long before);
}
