package com.emotion.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.emotion.common.PageResult;
import com.emotion.dto.request.achievement.*;
import com.emotion.dto.response.achievement.AchievementResponse;
import com.emotion.entity.Achievement;

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

/**
 * 成就服务接口
 * 
 * @author huazhongmin
 * @date 2025-09-08
 */
public interface AchievementService extends IService<Achievement> {
    
    /**
     * 分页查询成就
     */
    IPage<Achievement> getPage(AchievementPageRequest request);
    
    /**
     * 根据分类查询成就
     */
    List<Achievement> getByCategory(String category);
    
    /**
     * 根据稀有度查询成就
     */
    List<Achievement> getByRarity(String rarity);
    
    /**
     * 根据条件类型查询成就
     */
    List<Achievement> getByConditionType(String conditionType);
    
    /**
     * 查询已解锁的成就
     */
    List<Achievement> getUnlockedAchievements();
    
    /**
     * 查询未解锁的成就
     */
    List<Achievement> getLockedAchievements();
    
    /**
     * 查询隐藏的成就
     */
    List<Achievement> getHiddenAchievements();
    
    /**
     * 查询可见的成就
     */
    List<Achievement> getVisibleAchievements();
    
    /**
     * 根据进度范围查询成就
     */
    List<Achievement> getByProgressRange(Double minProgress, Double maxProgress);
    
    /**
     * 根据解锁时间范围查询成就
     */
    List<Achievement> getByUnlockTimeRange(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计已解锁成就数量
     */
    Long countUnlockedAchievements();
    
    /**
     * 统计未解锁成就数量
     */
    Long countLockedAchievements();
    
    /**
     * 统计指定分类的成就数量
     */
    Long countByCategory(String category);
    
    /**
     * 统计指定稀有度的成就数量
     */
    Long countByRarity(String rarity);
    
    /**
     * 获取平均进度
     */
    Double getAvgProgress();
    
    /**
     * 根据分类获取平均进度
     */
    Double getAvgProgressByCategory(String category);
    
    /**
     * 获取最近解锁的成就
     */
    List<Achievement> getRecentlyUnlocked(Integer limit);
    
    /**
     * 获取接近完成的成就
     */
    List<Achievement> getNearCompletion();
    
    /**
     * 获取稀有成就
     */
    List<Achievement> getRareAchievements();
    
    /**
     * 解锁成就
     */
    boolean unlockAchievement(String id, LocalDateTime unlockedTime);
    
    /**
     * 更新成就进度
     */
    boolean updateProgress(String id, Double progress);
    
    /**
     * 更新隐藏状态
     */
    boolean updateHiddenStatus(String id, Integer isHidden);
    
    /**
     * 获取推荐成就
     */
    List<Achievement> getRecommendedAchievements(String category, String rarity, Integer limit);

    // 新增的Response相关方法

    /**
     * 分页查询成就响应
     */
    PageResult<AchievementResponse> getPageWithResponse(AchievementPageRequest request);

    /**
     * 根据ID获取成就响应
     */
    AchievementResponse getAchievementResponseById(String id);

    /**
     * 创建成就并返回响应
     */
    AchievementResponse createAchievementWithResponse(AchievementCreateRequest request);

    /**
     * 更新成就并返回响应
     */
    AchievementResponse updateAchievementWithResponse(AchievementUpdateRequest request);

    /**
     * 根据分类查询成就响应
     */
    List<AchievementResponse> getByCategoryWithResponse(String category);

    /**
     * 根据稀有度查询成就响应
     */
    List<AchievementResponse> getByRarityWithResponse(String rarity);

    /**
     * 查询已解锁的成就响应
     */
    List<AchievementResponse> getUnlockedAchievementsWithResponse();

    /**
     * 查询未解锁的成就响应
     */
    List<AchievementResponse> getLockedAchievementsWithResponse();

    /**
     * 查询最近解锁的成就响应
     */
    List<AchievementResponse> getRecentlyUnlockedWithResponse(Integer limit);
}