package com.ycwl.basic.pricing.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycwl.basic.pricing.entity.PriceVoucherUsageRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.Date;
import java.util.List;

/**
 * 券码使用记录Mapper
 */
@Mapper
public interface PriceVoucherUsageRecordMapper extends BaseMapper<PriceVoucherUsageRecord> {
    
    /**
     * 根据券码ID查询使用记录
     * 
     * @param voucherCodeId 券码ID
     * @return 使用记录列表
     */
    @Select("SELECT * FROM price_voucher_usage_record WHERE voucher_code_id = #{voucherCodeId} AND deleted = 0 ORDER BY use_time DESC")
    List<PriceVoucherUsageRecord> selectByVoucherCodeId(@Param("voucherCodeId") Long voucherCodeId);
    
    /**
     * 根据券码查询使用记录
     * 
     * @param voucherCode 券码
     * @return 使用记录列表
     */
    @Select("SELECT * FROM price_voucher_usage_record WHERE voucher_code = #{voucherCode} AND deleted = 0 ORDER BY use_time DESC")
    List<PriceVoucherUsageRecord> selectByVoucherCode(@Param("voucherCode") String voucherCode);

    
    /**
     * 根据券码ID和用户ID查询使用记录
     * 
     * @param voucherCodeId 券码ID
     * @param faceId 用户faceId
     * @return 使用记录列表
     */
    @Select("SELECT * FROM price_voucher_usage_record WHERE voucher_code_id = #{voucherCodeId} AND face_id = #{faceId} AND deleted = 0 ORDER BY use_time DESC")
    List<PriceVoucherUsageRecord> selectByVoucherCodeAndFaceId(@Param("voucherCodeId") Long voucherCodeId, @Param("faceId") Long faceId);
    
    /**
     * 根据用户和景区查询使用记录
     * 
     * @param faceId 用户faceId
     * @param scenicId 景区ID
     * @return 使用记录列表
     */
    @Select("SELECT * FROM price_voucher_usage_record WHERE face_id = #{faceId} AND scenic_id = #{scenicId} AND deleted = 0 ORDER BY use_time DESC")
    List<PriceVoucherUsageRecord> selectByFaceIdAndScenicId(@Param("faceId") Long faceId, @Param("scenicId") Long scenicId);
    
    /**
     * 统计用户在指定券码上的使用次数
     * 
     * @param faceId 用户faceId
     * @param voucherCodeId 券码ID
     * @return 使用次数
     */
    @Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND voucher_code_id = #{voucherCodeId} AND deleted = 0")
    Integer countByFaceIdAndVoucherCodeId(@Param("faceId") Long faceId, @Param("voucherCodeId") Long voucherCodeId);
    
    /**
     * 统计指定时间段内用户的使用次数
     * 
     * @param faceId 用户faceId
     * @param voucherCodeId 券码ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 使用次数
     */
    @Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND voucher_code_id = #{voucherCodeId} " +
            "AND use_time BETWEEN #{startTime} AND #{endTime} AND deleted = 0")
    Integer countByFaceIdAndVoucherCodeIdAndTimeRange(@Param("faceId") Long faceId, 
                                                      @Param("voucherCodeId") Long voucherCodeId,
                                                      @Param("startTime") Date startTime, 
                                                      @Param("endTime") Date endTime);
    
    /**
     * 获取用户最后一次使用该券码的时间
     * 
     * @param faceId 用户faceId
     * @param voucherCodeId 券码ID
     * @return 最后使用时间
     */
    @Select("SELECT MAX(use_time) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND voucher_code_id = #{voucherCodeId} AND deleted = 0")
    Date getLastUseTimeByFaceIdAndVoucherCodeId(@Param("faceId") Long faceId, @Param("voucherCodeId") Long voucherCodeId);
    
    /**
     * 根据批次ID统计使用记录数量
     * 
     * @param batchId 批次ID
     * @return 使用记录数量
     */
    @Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE batch_id = #{batchId} AND deleted = 0")
    Integer countByBatchId(@Param("batchId") Long batchId);
    
    /**
     * 统计用户在指定批次下的使用次数
     * 
     * @param faceId 用户faceId
     * @param batchId 批次ID
     * @return 使用次数
     */
    @Select("SELECT COUNT(*) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND batch_id = #{batchId} AND deleted = 0")
    Integer countByFaceIdAndBatchId(@Param("faceId") Long faceId, @Param("batchId") Long batchId);
    
    /**
     * 获取用户在指定批次下最后一次使用时间
     * 
     * @param faceId 用户faceId
     * @param batchId 批次ID
     * @return 最后使用时间
     */
    @Select("SELECT MAX(use_time) FROM price_voucher_usage_record WHERE face_id = #{faceId} AND batch_id = #{batchId} AND deleted = 0")
    Date getLastUseTimeByFaceIdAndBatchId(@Param("faceId") Long faceId, @Param("batchId") Long batchId);
    
    /**
     * 查询券码使用记录（用于PageHelper分页）
     *
     * @param batchId 批次ID（可选）
     * @param voucherCode 券码（可选）
     * @param faceId 用户faceId（可选）
     * @param scenicId 景区ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 使用记录列表
     */
    @Select("<script>" +
            "SELECT * FROM price_voucher_usage_record WHERE deleted = 0" +
            "<if test='batchId != null'>AND batch_id = #{batchId}</if>" +
            "<if test=\"voucherCode != null and voucherCode.length() > 0\">AND voucher_code LIKE CONCAT('%', #{voucherCode}, '%')</if>" +
            "<if test=\"faceId != null\">AND face_id = #{faceId}</if>" +
            "<if test=\"scenicId != null\">AND scenic_id = #{scenicId}</if>" +
            "<if test=\"startTime != null\">AND use_time >= #{startTime}</if>" +
            "<if test=\"endTime != null\">AND use_time &lt;= #{endTime}</if>" +
            "ORDER BY use_time DESC" +
            "</script>")
    List<PriceVoucherUsageRecord> selectListWithConditions(@Param("batchId") Long batchId,
                                                           @Param("voucherCode") String voucherCode,
                                                           @Param("faceId") Long faceId,
                                                           @Param("scenicId") Long scenicId,
                                                           @Param("startTime") Date startTime,
                                                           @Param("endTime") Date endTime);
}