package org.xyzh.study.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.study.TbLearningTask;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.xyzh.common.vo.TaskItemVO;

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

/**
 * @description LearningTaskMapper.java文件描述 学习任务数据访问层
 * @filename LearningTaskMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
@Mapper
public interface LearningTaskMapper extends BaseMapper<TbLearningTask> {

    /**
     * @description 查询学习任务列表
     * @param filter 过滤条件
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectLearningTasks(@Param("filter") TbLearningTask filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据任务ID查询任务信息
     * @param taskId 任务ID
     * @return TbLearningTask 任务信息
     * @author yslg
     * @since 2025-10-15
     */
    TbLearningTask selectByTaskId(@Param("taskId") String taskId);

    /**
     * @description 根据用户ID查询学习任务列表
     * @param userId 用户ID
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectByUserId(@Param("userId") String userId);

    /**
     * @description 根据任务名称查询任务
     * @param name 任务名称
     * @return TbLearningTask 任务信息
     * @author yslg
     * @since 2025-10-15
     */
    TbLearningTask selectByName(@Param("name") String name);

    /**
     * @description 根据状态查询学习任务列表（包含权限过滤）
     * @param status 状态
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectByStatus(@Param("status") Integer status, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据优先级查询学习任务列表（包含权限过滤）
     * @param priority 优先级
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectByPriority(@Param("priority") Integer priority, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 查询用户待完成任务列表
     * @param userId 用户ID
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectPendingTasksByUserId(@Param("userId") String userId);

    /**
     * @description 查询用户已完成任务列表
     * @param userId 用户ID
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectCompletedTasksByUserId(@Param("userId") String userId);

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

    /**
     * @description 插入学习任务
     * @param learningTask 学习任务
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int insertLearningTask(TbLearningTask learningTask);

    /**
     * @description 更新学习任务
     * @param learningTask 学习任务
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int updateLearningTask(TbLearningTask learningTask);

    /**
     * @description 删除学习任务
     * @param learningTask 学习任务
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int deleteLearningTask(TbLearningTask learningTask);

    /**
     * @description 批量插入学习任务
     * @param learningTaskList 学习任务列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int batchInsertLearningTasks(@Param("learningTaskList") List<TbLearningTask> learningTaskList);

    /**
     * @description 批量删除学习任务
     * @param ids 任务ID列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int batchDeleteLearningTasks(@Param("ids") List<String> ids);

    /**
     * @description 分页查询学习任务
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbLearningTask> 学习任务列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbLearningTask> selectLearningTasksPage(@Param("filter") TbLearningTask filter, @Param("pageParam") PageParam pageParam, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 查询用户学习任务分页（包含权限过滤）
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @param userDeptRoles 用户部门角色列表
     * @return List<TaskItemVO> 学习任务列表（包含用户状态信息）
     * @author yslg
     * @since 2025-10-15
     */
    List<TaskItemVO> selectUserLearningTasksPage(@Param("filter") TaskItemVO filter, @Param("pageParam") PageParam pageParam, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 统计学习任务总数
     * @param filter 过滤条件
     * @param userDeptRoles 用户部门角色列表
     * @return long 总数
     * @author yslg
     * @since 2025-10-15
     */
    long countLearningTasks(@Param("filter") TbLearningTask filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 获取任务统计（按标签分组，统计指定时间范围内当前用户任务的完成进度）
     * @param filter 过滤条件（包含开始、结束时间）
     * @param userDeptRoles 用户部门角色列表
     * @param userId 当前用户ID
     * @return List<Map<String, Object>> 任务统计列表
     * @author yslg
     * @since 2025-10-15
     */
    List<Map<String, Object>> getTaskStaticByTag(@Param("filter") TbLearningTask filter,
                                                 @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles,
                                                 @Param("userId") String userId);
}
