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

import java.util.List;

/**
 * @description 学习节点数据访问层
 * @filename CourseNodeMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-21
 */
@Mapper
public interface CourseNodeMapper extends BaseMapper<TbCourseNode> {

    /**
     * @description 查询学习节点列表
     * @param filter 过滤条件
     * @return List<TbCourseNode> 学习节点列表
     * @author yslg
     * @since 2025-10-21
     */
    List<TbCourseNode> selectCourseNodes(TbCourseNode filter);

    /**
     * @description 根据章节ID列表查询学习节点列表
     * @param chapterIDs 章节ID列表
     * @return List<TbCourseNode> 学习节点列表
     * @author yslg
     * @since 2025-10-21
     */
    List<TbCourseNode> selectCourseNodesByChapterIDs(@Param("chapterIDs") List<String> chapterIDs);
    /**
     * @description 根据节点ID查询节点信息
     * @param nodeId 节点ID
     * @return TbCourseNode 节点信息
     * @author yslg
     * @since 2025-10-21
     */
    TbCourseNode selectByNodeId(@Param("nodeId") String nodeId);

    /**
     * @description 根据章节ID查询节点列表
     * @param chapterId 章节ID
     * @return List<TbCourseNode> 节点列表
     * @author yslg
     * @since 2025-10-21
     */
    List<TbCourseNode> selectByChapterId(@Param("chapterId") String chapterId);

    /**
     * @description 根据节点名称查询节点
     * @param name 节点名称
     * @return TbCourseNode 节点信息
     * @author yslg
     * @since 2025-10-21
     */
    TbCourseNode selectByName(@Param("name") String name);

    /**
     * @description 根据节点类型查询节点列表
     * @param nodeType 节点类型
     * @return List<TbCourseNode> 节点列表
     * @author yslg
     * @since 2025-10-21
     */
    List<TbCourseNode> selectByNodeType(@Param("nodeType") Integer nodeType);

    /**
     * @description 根据章节ID和排序查询节点列表
     * @param chapterId 章节ID
     * @return List<TbCourseNode> 节点列表
     * @author yslg
     * @since 2025-10-21
     */
    List<TbCourseNode> selectByChapterIdOrderBySort(@Param("chapterId") String chapterId);

    /**
     * @description 检查节点名称是否存在
     * @param name 节点名称
     * @param excludeId 排除的节点ID（用于更新时排除自身）
     * @return int 存在的数量
     * @author yslg
     * @since 2025-10-21
     */
    int countByName(@Param("name") String name, @Param("excludeId") String excludeId);

    /**
     * @description 插入学习节点
     * @param courseNode 学习节点
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-21
     */
    int insertCourseNode(TbCourseNode courseNode);

    /**
     * @description 更新学习节点
     * @param courseNode 学习节点
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-21
     */
    int updateCourseNode(TbCourseNode courseNode);

    /**
     * @description 删除学习节点
     * @param courseNode 学习节点
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-21
     */
    int deleteCourseNode(TbCourseNode courseNode);

    /**
     * @description 批量插入学习节点
     * @param courseNodeList 学习节点列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-21
     */
    int batchInsertCourseNodes(@Param("courseNodeList") List<TbCourseNode> courseNodeList);

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

    /**
     * @description 根据章节ID批量删除节点
     * @param chapterId 章节ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-21
     */
    int deleteByChapterId(@Param("chapterId") String chapterId);

    /**
     * @description 分页查询学习节点
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return List<TbCourseNode> 学习节点列表
     * @author yslg
     * @since 2025-10-21
     */
    List<TbCourseNode> selectCourseNodesPage(@Param("filter") TbCourseNode filter, @Param("pageParam") PageParam pageParam);

    /**
     * @description 统计学习节点总数
     * @param filter 过滤条件
     * @return long 总数
     * @author yslg
     * @since 2025-10-21
     */
    long countCourseNodes(@Param("filter") TbCourseNode filter);
}

