package link.at17.mid.tushare.dao;

import com.alibaba.fastjson2.JSONObject;
import com.github.yulichang.base.MPJBaseMapper;

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.interfaces.ITsTradeDate;

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

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

@Component
@Mapper
public interface StockDailyDao extends MPJBaseMapper<StockValue>, ITsTradeDate {
    /**
     * 批量插入/更新日线数据
     * @param list
     */
    @BatchInsert
    int insertOrUpdateList(@BatchList List<JSONObject> list);
    /**
     * 获取除权日线数据 + 基本行情数据
     * @param tsCode Tushare 股票代码，不允许为空
     * @param endDate 结束日期(包含)，留空则为最新一个交易日
     * @param before 多少个交易日以前，留空则查询上市至 endDate 以来所有数据
     * @return
     */
    <T extends StockValue> List<T> getExDailyBefore(@Param("stockCode") @NotNull String tsCode, @Param("endDate") Temporal endDate, @Param("before") Long before);
    /**
     * 获取前复权日线数据
     * @param tsCode Tushare 股票代码，不允许为空
     * @param startDate 开始日期，留空则为股票上市日起
     * @param endDate 结束日期，null 则为最新一个交易日
     * @return
     */
    <T extends StockValue> List<T> getQfqDaily(@Param("stockCode") @NotNull String tsCode, @Param("startDate") Temporal startDate, @Param("endDate") Temporal endDate);
    /**
     * 获取前复权日线数据
     * @param tsCode Tushare 股票代码，不允许为空
     * @param endDate 结束日期，留空则为最新一个交易日
     * @param before 多少个交易日以前，null 则查询上市以来所有数据
     * @return
     */
    <T extends StockValue> List<T> getQfqDailyBefore(@Param("stockCode") @NotNull String tsCode, @Param("endDate") Temporal endDate, @Param("before") Long before);
    /**
     * 获取前复权日线数据 + 基本行情数据
     * @param tsCode Tushare 股票代码，不允许为空
     * @param startDate 开始日期（包含），留空则为上市第一日
     * @param after 多少个交易日以前，null 则查询 startDate 以来所有数据
     * @return
     */
    <T extends StockValue> List<T> getExQfqDailyAfter(@Param("stockCode") @NotNull String tsCode, @Param("startDate") Temporal startDate, @Param("after") Long after);
    /**
     * 获取前复权日线数据 + 基本行情数据
     * @param tsCode Tushare 股票代码，不允许为空
     * @param endDate 结束日期，留空则为最新一个交易日
     * @param before 多少个交易日以前，null 则查询上市以来所有数据
     * @return
     */
    <T extends StockValue> List<T> getExQfqDailyBefore(@Param("stockCode") @NotNull String tsCode, @Param("endDate") Temporal endDate, @Param("before") Long before);
    /**
     * 获取前复权日线数据
     * @param tsCode Tushare 股票代码，不允许为空
     * @param startDate 开始日期（包含），留空则为上市第一日
     * @param after 多少个交易日以前，null 则查询 startDate 以来所有数据
     * @return
     */
    <T extends StockValue> List<T> getQfqDailyAfter(@Param("stockCode") @NotNull String tsCode, @Param("startDate") Temporal startDate, @Param("after") Long after);
    
}
