package org.xyzh.api.usercenter.achievement;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.usercenter.TbAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievement;

import java.util.List;

/**
 * @description 用户成就服务接口
 * @filename UserAchievementService.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
public interface UserAchievementService {

    /**
     * @description 获取所有成就列表
     * @param type 成就类型（可选）
     * @param level 成就等级（可选）
     * @return ResultDomain<TbAchievement> 成就列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbAchievement> getAllAchievements(Integer type, Integer level);

    /**
     * @description 获取用户已获得的成就
     * @param userID 用户ID
     * @param type 成就类型（可选）
     * @return ResultDomain<TbUserAchievement> 用户成就列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbUserAchievement> getUserAchievements(String userID, Integer type);

    /**
     * @description 检查用户是否已获得成就
     * @param userID 用户ID
     * @param achievementID 成就ID
     * @return ResultDomain<Boolean> 是否已获得
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> hasAchievement(String userID, String achievementID);

    /**
     * @description 授予用户成就
     * @param userID 用户ID
     * @param achievementID 成就ID
     * @return ResultDomain<TbUserAchievement> 授予结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbUserAchievement> grantAchievement(String userID, String achievementID);

    /**
     * @description 获取成就详情
     * @param achievementID 成就ID
     * @return ResultDomain<TbAchievement> 成就详情
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbAchievement> getAchievementDetail(String achievementID);

    /**
     * @description 检查用户是否满足成就条件
     * @param userID 用户ID
     * @param achievementID 成就ID
     * @return ResultDomain<Boolean> 是否满足条件
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> checkAchievementCondition(String userID, String achievementID);
}
