package com.yingpai.stock.mapper;

import com.yingpai.stock.domain.StockPoolHistory;
import com.yingpai.stock.domain.vo.StockPoolHistoryVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

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

/**
 * 股票池历史Mapper接口
 */
public interface StockPoolHistoryMapper extends BaseMapperPlus<StockPoolHistory, StockPoolHistoryVo> {

    /**
     * 查询指定股票在指定日期之前最近一天的收盘价
     * @param stockCode 股票代码
     * @param recordDate 当前记录日期
     * @return 昨日收盘价，如果没有则返回null
     */
    @Select("SELECT day_close_price FROM stock_pool_history " +
            "WHERE stock_code = #{stockCode} AND record_date < #{recordDate} " +
            "ORDER BY record_date DESC LIMIT 1")
    BigDecimal selectPreviousClosePrice(@Param("stockCode") String stockCode, @Param("recordDate") LocalDate recordDate);

    /**
     * 查询指定股票在指定日期范围内的最高价（用于强势池10天跟踪）
     * @param stockCode 股票代码
     * @param startDate 开始日期（入池日期）
     * @param endDate 结束日期（当前导入日期）
     * @return 日期范围内最高价，如果没有则返回null
     */
    @Select("SELECT MAX(day_highest_price) FROM stock_pool_history " +
            "WHERE stock_code = #{stockCode} " +
            "AND record_date >= #{startDate} " +
            "AND record_date <= #{endDate}")
    BigDecimal selectMaxHighPriceInRange(@Param("stockCode") String stockCode,
                                         @Param("startDate") LocalDate startDate,
                                         @Param("endDate") LocalDate endDate);

    /**
     * 查询指定股票从指定日期的第二天开始向后10个交易日的最高价（用于计算high_trend）
     * 不包含当天，从第二天开始计算未来涨幅
     * @param stockCode 股票代码
     * @param startDate 开始日期（记录日期）
     * @param endDate 结束日期（当前导入日期，限制查询范围）
     * @return 向后10个交易日内最高价（不含当天），如果没有则返回null
     */
    @Select("SELECT MAX(day_highest_price) FROM (" +
            "  SELECT day_highest_price " +
            "  FROM stock_pool_history " +
            "  WHERE stock_code = #{stockCode} " +
            "  AND record_date > #{startDate} " +
            "  AND record_date <= #{endDate} " +
            "  ORDER BY record_date ASC " +
            "  LIMIT 10" +
            ") AS forward_ten_days")
    BigDecimal selectForwardTenDaysHighestPrice(@Param("stockCode") String stockCode,
                                                @Param("startDate") LocalDate startDate,
                                                @Param("endDate") LocalDate endDate);

    /**
     * 查询向前N个交易日的日期列表
     * 用于回溯更新时确定需要更新的日期范围
     * @param endDate 结束日期（当前导入日期）
     * @param limit 向前查询的交易日数量
     * @return 交易日期列表，按日期降序排列
     */
    @Select("SELECT DISTINCT record_date FROM stock_pool_history " +
            "WHERE record_date <= #{endDate} " +
            "ORDER BY record_date DESC " +
            "LIMIT #{limit}")
    List<LocalDate> selectPastTradingDays(@Param("endDate") LocalDate endDate,
                                          @Param("limit") int limit);
}
