package com.emotion.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.emotion.common.BasePageRequest;
import com.emotion.common.PageResult;
import com.emotion.dto.request.reward.RewardCreateRequest;
import com.emotion.dto.request.reward.RewardUpdateRequest;
import com.emotion.dto.response.reward.RewardResponse;
import com.emotion.entity.Reward;

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

/**
 * 奖励服务接口
 * 
 * @author huazhongmin
 * @date 2025-09-08
 */
public interface RewardService extends IService<Reward> {
    
    /**
     * 分页查询奖励
     */
    IPage<Reward> getPage(BasePageRequest request);
    
    /**
     * 分页查询奖励响应
     */
    PageResult<RewardResponse> getPageWithResponse(BasePageRequest request);

    /**
     * 根据用户ID分页查询奖励
     */
    IPage<Reward> getPageByUserId(BasePageRequest request, String userId);
    
    /**
     * 根据ID获取奖励响应
     */
    RewardResponse getRewardResponseById(String id);

    /**
     * 根据用户ID查询奖励
     */
    List<Reward> getByUserId(String userId);
    
    /**
     * 根据奖励类型查询奖励
     */
    List<Reward> getByRewardType(String rewardType);
    
    /**
     * 根据用户ID和奖励类型查询奖励
     */
    List<Reward> getByUserIdAndRewardType(String userId, String rewardType);
    
    /**
     * 根据状态查询奖励
     */
    List<Reward> getByStatus(String status);
    
    /**
     * 根据用户ID和状态查询奖励
     */
    List<Reward> getByUserIdAndStatus(String userId, String status);
    
    /**
     * 根据积分范围查询奖励
     */
    List<Reward> getByPointsRange(Integer minPoints, Integer maxPoints);
    
    /**
     * 根据时间范围查询奖励
     */
    List<Reward> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据获得时间范围查询奖励
     */
    List<Reward> getByEarnedTimeRange(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计用户的奖励数量
     */
    Long countByUserId(String userId);
    
    /**
     * 统计指定类型的奖励数量
     */
    Long countByRewardType(String rewardType);
    
    /**
     * 统计用户指定类型的奖励数量
     */
    Long countByUserIdAndRewardType(String userId, String rewardType);
    
    /**
     * 统计指定状态的奖励数量
     */
    Long countByStatus(String status);
    
    /**
     * 统计用户的总积分
     */
    Integer sumPointsByUserId(String userId);
    
    /**
     * 统计用户指定类型的总积分
     */
    Integer sumPointsByUserIdAndRewardType(String userId, String rewardType);
    
    /**
     * 查询用户最近获得的奖励
     */
    List<Reward> getRecentByUserId(String userId, Integer limit);
    
    /**
     * 查询高积分奖励
     */
    List<Reward> getHighPointsRewards(Integer minPoints);
    
    /**
     * 查询待领取的奖励
     */
    List<Reward> getPendingRewardsByUserId(String userId);
    
    /**
     * 查询已领取的奖励
     */
    List<Reward> getClaimedRewardsByUserId(String userId);
    
    /**
     * 查询已过期的奖励
     */
    List<Reward> getExpiredRewards();
    
    /**
     * 更新奖励状态
     */
    boolean updateStatus(String id, String status, LocalDateTime claimedTime);
    
    /**
     * 批量更新过期奖励状态
     */
    boolean updateExpiredRewards();
    
    /**
     * 根据来源查询奖励
     */
    List<Reward> getBySource(String source);
    
    /**
     * 创建奖励
     */
    Reward createReward(String userId, String rewardType, String value,
            String description, String topicId, String achievementId, String icon, String rarity);

    /**
     * 创建奖励并返回响应
     */
    RewardResponse createRewardWithResponse(RewardCreateRequest request);

    /**
     * 更新奖励并返回响应
     */
    RewardResponse updateRewardWithResponse(RewardUpdateRequest request);

    /**
     * 删除奖励
     */
    boolean deleteReward(String id);
}