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.TbTaskCourse;

import java.util.List;

/**
 * @description TaskCourseMapper.java文件描述 任务课程关联数据访问层
 * @filename TaskCourseMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
@Mapper
public interface TaskCourseMapper extends BaseMapper<TbTaskCourse> {

    /**
     * @description 查询任务课程关联列表
     * @param filter 过滤条件
     * @return List<TbTaskCourse> 任务课程关联列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTaskCourse> selectTaskCourses(TbTaskCourse filter);

    /**
     * @description 根据关联ID查询关联信息
     * @param relationId 关联ID
     * @return TbTaskCourse 关联信息
     * @author yslg
     * @since 2025-10-15
     */
    TbTaskCourse selectByRelationId(@Param("relationId") String relationId);

    /**
     * @description 根据任务ID查询课程关联列表
     * @param taskId 任务ID
     * @return List<TbTaskCourse> 课程关联列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTaskCourse> selectByTaskId(@Param("taskId") String taskId);

    /**
     * @description 根据课程ID查询任务关联列表
     * @param courseId 课程ID
     * @return List<TbTaskCourse> 任务关联列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTaskCourse> selectByCourseId(@Param("courseId") String courseId);

    /**
     * @description 根据任务ID和课程ID查询关联信息
     * @param taskId 任务ID
     * @param courseId 课程ID
     * @return TbTaskCourse 关联信息
     * @author yslg
     * @since 2025-10-15
     */
    TbTaskCourse selectByTaskIdAndCourseId(@Param("taskId") String taskId, @Param("courseId") String courseId);

    /**
     * @description 检查任务课程关联是否存在
     * @param taskId 任务ID
     * @param courseId 课程ID
     * @param excludeId 排除的关联ID（用于更新时排除自身）
     * @return int 存在的数量
     * @author yslg
     * @since 2025-10-15
     */
    int countByTaskIdAndCourseId(@Param("taskId") String taskId, @Param("courseId") String courseId, @Param("excludeId") String excludeId);

    /**
     * @description 插入任务课程关联
     * @param taskCourse 任务课程关联
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int insertTaskCourse(TbTaskCourse taskCourse);

    /**
     * @description 更新任务课程关联
     * @param taskCourse 任务课程关联
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int updateTaskCourse(TbTaskCourse taskCourse);

    /**
     * @description 删除任务课程关联
     * @param taskCourse 任务课程关联
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int deleteTaskCourse(TbTaskCourse taskCourse);

    /**
     * @description 批量插入任务课程关联
     * @param taskCourseList 任务课程关联列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int batchInsertTaskCourses(@Param("taskCourseList") List<TbTaskCourse> taskCourseList);

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

    /**
     * @description 根据任务ID批量删除课程关联
     * @param taskId 任务ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int deleteByTaskId(@Param("taskId") String taskId);

    /**
     * @description 根据课程ID批量删除任务关联
     * @param courseId 课程ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int deleteByCourseId(@Param("courseId") String courseId);

    /**
     * @description 分页查询任务课程关联
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return List<TbTaskCourse> 任务课程关联列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTaskCourse> selectTaskCoursesPage(@Param("filter") TbTaskCourse filter, @Param("pageParam") PageParam pageParam);

    /**
     * @description 统计任务课程关联总数
     * @param filter 过滤条件
     * @return long 总数
     * @author yslg
     * @since 2025-10-15
     */
    long countTaskCourses(@Param("filter") TbTaskCourse filter);
}
