package org.xyzh.achievement.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.usercenter.TbUserAchievement;

import java.util.List;
import java.util.Map;

/**
 * @description 用户成就数据访问层
 * @filename UserAchievementMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-24
 */
@Mapper
public interface UserAchievementMapper extends BaseMapper<TbUserAchievement> {

    /**
     * @description 查询用户成就列表
     * @param filter 过滤条件
     * @return List<TbUserAchievement> 用户成就列表
     */
    List<TbUserAchievement> selectUserAchievements(@Param("filter") TbUserAchievement filter);

    /**
     * @description 根据用户ID查询成就记录
     * @param userId 用户ID
     * @return List<TbUserAchievement> 成就记录列表
     */
    List<TbUserAchievement> selectByUserId(@Param("userId") String userId);

    /**
     * @description 根据用户ID和成就ID查询成就记录
     * @param userId 用户ID
     * @param achievementId 成就ID
     * @return TbUserAchievement 成就记录
     */
    TbUserAchievement selectByUserIdAndAchievementId(@Param("userId") String userId, @Param("achievementId") String achievementId);

    /**
     * @description 根据用户ID和成就类型查询成就记录
     * @param userId 用户ID
     * @param type 成就类型
     * @return List<TbUserAchievement> 成就记录列表
     */
    List<TbUserAchievement> selectByUserIdAndType(@Param("userId") String userId, @Param("type") Integer type);

    /**
     * @description 查询用户成就统计
     * @param userId 用户ID
     * @return Map<String, Object> 统计信息
     */
    Map<String, Object> selectAchievementStatistics(@Param("userId") String userId);

    /**
     * @description 查询成就的最近获得者
     * @param achievementId 成就ID
     * @param limit 查询数量
     * @return List<TbUserAchievement> 用户成就列表
     */
    List<TbUserAchievement> selectRecentAchievers(@Param("achievementId") String achievementId, @Param("limit") Integer limit);

    /**
     * @description 查询成就排行榜（按用户获得成就数量）
     * @param limit 排行榜条数
     * @return List<Map<String, Object>> 排行榜数据
     */
    List<Map<String, Object>> selectUserAchievementRanking(@Param("limit") Integer limit);

    /**
     * @description 插入用户成就
     * @param userAchievement 用户成就
     * @return int 影响行数
     */
    int insertUserAchievement(TbUserAchievement userAchievement);

    /**
     * @description 更新用户成就
     * @param userAchievement 用户成就
     * @return int 影响行数
     */
    int updateUserAchievement(TbUserAchievement userAchievement);

    /**
     * @description 删除用户成就
     * @param id 用户成就ID
     * @return int 影响行数
     */
    int deleteUserAchievement(@Param("id") String id);

    /**
     * @description 根据用户ID和成就ID删除
     * @param userId 用户ID
     * @param achievementId 成就ID
     * @return int 影响行数
     */
    int deleteByUserIdAndAchievementId(@Param("userId") String userId, @Param("achievementId") String achievementId);

    /**
     * @description 批量插入用户成就
     * @param userAchievementList 用户成就列表
     * @return int 影响行数
     */
    int batchInsertUserAchievements(@Param("userAchievementList") List<TbUserAchievement> userAchievementList);

    /**
     * @description 分页查询用户成就
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return List<TbUserAchievement> 用户成就列表
     */
    List<TbUserAchievement> selectUserAchievementsPage(@Param("filter") TbUserAchievement filter, @Param("pageParam") PageParam pageParam);

    /**
     * @description 统计用户成就总数
     * @param filter 过滤条件
     * @return long 总数
     */
    long countUserAchievements(@Param("filter") TbUserAchievement filter);
}

