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.TbAchievement;
import org.xyzh.common.vo.AchievementVO;
import org.xyzh.common.vo.UserDeptRoleVO;

import java.util.List;

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

    /**
     * @description 查询成就列表
     * @param filter 过滤条件
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbAchievement> 成就列表
     */
    List<TbAchievement> selectAchievements(@Param("filter") TbAchievement filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据成就ID查询成就信息
     * @param achievementId 成就ID
     * @return TbAchievement 成就信息
     */
    TbAchievement selectByAchievementId(@Param("achievementId") String achievementId);

    /**
     * @description 根据类型查询成就列表（包含权限过滤）
     * @param type 成就类型
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbAchievement> 成就列表
     */
    List<TbAchievement> selectByType(@Param("type") Integer type, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据类型和等级查询成就列表（包含权限过滤）
     * @param type 成就类型
     * @param level 成就等级
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbAchievement> 成就列表
     */
    List<TbAchievement> selectByTypeAndLevel(@Param("type") Integer type, @Param("level") Integer level, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据条件类型查询成就列表
     * @param conditionType 条件类型
     * @return List<TbAchievement> 成就列表
     */
    List<TbAchievement> selectByConditionType(@Param("conditionType") Integer conditionType);

    /**
     * @description 查询成就排行榜
     * @param limit 限制数量
     * @return List<TbAchievement> 成就排行榜
     */
    List<TbAchievement> selectAchievementRanking(@Param("limit") Integer limit);

    /**
     * @description 检查成就名称是否存在（包含权限过滤）
     * @param name 成就名称
     * @param excludeId 排除的成就ID（用于更新时排除自身）
     * @param userDeptRoles 用户部门角色列表
     * @return int 存在的数量
     */
    int countByName(@Param("name") String name, @Param("excludeId") String excludeId, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 插入成就
     * @param achievement 成就
     * @return int 影响行数
     */
    int insertAchievement(TbAchievement achievement);

    /**
     * @description 更新成就
     * @param achievement 成就
     * @return int 影响行数
     */
    int updateAchievement(TbAchievement achievement);

    /**
     * @description 删除成就
     * @param achievement 成就
     * @return int 影响行数
     */
    int deleteAchievement(TbAchievement achievement);

    /**
     * @description 批量插入成就
     * @param achievementList 成就列表
     * @return int 影响行数
     */
    int batchInsertAchievements(@Param("achievementList") List<TbAchievement> achievementList);

    /**
     * @description 批量删除成就
     * @param ids 成就ID列表
     * @return int 影响行数
     */
    int batchDeleteAchievements(@Param("ids") List<String> ids);

    /**
     * @description 分页查询成就
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbAchievement> 成就列表
     */
    List<TbAchievement> selectAchievementsPage(@Param("filter") TbAchievement filter, @Param("pageParam") PageParam pageParam, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 统计成就总数
     * @param filter 过滤条件
     * @param userDeptRoles 用户部门角色列表
     * @return long 总数
     */
    long countAchievements(@Param("filter") TbAchievement filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 联表查询用户成就列表（包含进度信息）- 带权限过滤
     * @param userId 用户ID
     * @param type 成就类型（可选）
     * @param userDeptRoles 用户部门角色列表
     * @return List<AchievementVO> 用户成就列表（包含进度）
     */
    List<AchievementVO> selectUserAchievementsWithProgress(
        @Param("userId") String userId, 
        @Param("type") Integer type, 
        @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles
    );
}

