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

import java.util.List;

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

    /**
     * @description 查询课程列表
     * @param filter 过滤条件
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> selectCourses(TbCourse filter);

    /**
     * @description 根据课程ID查询课程信息
     * @param courseId 课程ID
     * @return TbCourse 课程信息
     * @author yslg
     * @since 2025-10-15
     */
    TbCourse selectByCourseId(@Param("courseId") String courseId);

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

    /**
     * @description 根据状态查询课程列表
     * @param status 状态
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> selectByStatus(@Param("status") Integer status);

    /**
     * @description 根据类型查询课程列表
     * @param type 类型
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> selectByType(@Param("type") Integer type);

    /**
     * @description 根据难度查询课程列表
     * @param difficulty 难度
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> selectByDifficulty(@Param("difficulty") Integer difficulty);

    /**
     * @description 查询热门课程列表
     * @param limit 限制数量
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> selectHotCourses(@Param("limit") Integer limit);

    /**
     * @description 查询最新课程列表
     * @param limit 限制数量
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> selectLatestCourses(@Param("limit") Integer limit);

    /**
     * @description 根据关键词搜索课程
     * @param keyword 关键词
     * @return List<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbCourse> searchByKeyword(@Param("keyword") String keyword);

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

    /**
     * @description 插入课程
     * @param course 课程
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int insertCourse(TbCourse course);

    /**
     * @description 更新课程
     * @param course 课程
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int updateCourse(TbCourse course);

    /**
     * @description 删除课程
     * @param course 课程
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int deleteCourse(TbCourse course);

    /**
     * @description 批量插入课程
     * @param courseList 课程列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int batchInsertCourses(@Param("courseList") List<TbCourse> courseList);

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

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

    /**
     * @description 统计课程总数
     * @param filter 过滤条件
     * @return long 总数
     * @author yslg
     * @since 2025-10-15
     */
    long countCourses(@Param("filter") TbCourse filter);

    /**
     * @description 增加课程浏览次数
     * @param courseID 课程ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int incrementViewCount(@Param("courseID") String courseID);
}
