package com.ycwl.basic.pricing.mapper;

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

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

/**
 * 券码Mapper
 */
@Mapper
public interface PriceVoucherCodeMapper extends BaseMapper<PriceVoucherCode> {
    
    /**
     * 根据券码查询券码信息
     * @param code 券码
     * @return 券码信息
     */
    PriceVoucherCode selectByCode(@Param("code") String code);
    
    /**
     * 根据faceId和scenicId统计已领取的券码数量
     * @param faceId 用户faceId
     * @param scenicId 景区ID
     * @return 数量
     */
    Integer countByFaceIdAndScenicId(@Param("faceId") Long faceId, @Param("scenicId") Long scenicId);
    
    /**
     * 查询用户在指定景区的可用券码列表
     * @param faceId 用户faceId
     * @param scenicId 景区ID
     * @return 券码列表
     */
    List<PriceVoucherCode> selectAvailableVouchersByFaceIdAndScenicId(@Param("faceId") Long faceId, 
                                                                      @Param("scenicId") Long scenicId);
    
    /**
     * 根据批次ID获取可领取的券码（未领取状态）
     * @param batchId 批次ID
     * @param limit 限制数量
     * @return 券码列表
     */
    List<PriceVoucherCode> selectUnclaimedVouchersByBatchId(@Param("batchId") Long batchId, 
                                                            @Param("limit") Integer limit);
    
    /**
     * 领取券码（更新状态为已领取）
     * @param id 券码ID
     * @param faceId 用户faceId
     * @param claimedTime 领取时间
     * @return 影响行数
     */
    int claimVoucher(@Param("id") Long id, 
                     @Param("faceId") Long faceId, 
                     @Param("claimedTime") LocalDateTime claimedTime);
    
    /**
     * 使用券码（更新状态为已使用）
     * @param code 券码
     * @param usedTime 使用时间
     * @param remark 使用备注
     * @return 影响行数
     */
    int useVoucher(@Param("code") String code, 
                   @Param("usedTime") LocalDateTime usedTime, 
                   @Param("remark") String remark);
    
    /**
     * 根据批次ID查询券码列表（支持分页）
     * @param batchId 批次ID
     * @return 券码列表
     */
    List<PriceVoucherCode> selectByBatchId(@Param("batchId") Long batchId);
    
    /**
     * 查询用户的券码列表
     * @param faceId 用户faceId
     * @param scenicId 景区ID（可选）
     * @return 券码列表
     */
    List<PriceVoucherCode> selectUserVouchers(@Param("faceId") Long faceId, 
                                              @Param("scenicId") Long scenicId);
    
    /**
     * 根据批次ID查询第一个可用的券码
     * @param batchId 批次ID
     * @return 可用券码
     */
    PriceVoucherCode findFirstAvailableByBatchId(@Param("batchId") Long batchId);
    
    /**
     * 随机获取一个未被打印过的可用券码
     * @param scenicId 景区ID
     * @return 可用券码
     */
    PriceVoucherCode findRandomUnprintedVoucher(@Param("scenicId") Long scenicId);
}