package org.xyzh.api.study.course;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.core.page.PageRequest;
import org.xyzh.common.dto.study.TbCourse;
import org.xyzh.common.dto.study.TbCourseChapter;
import org.xyzh.common.dto.study.TbCourseNode;
import org.xyzh.common.dto.study.TbLearningRecord;
import org.xyzh.common.vo.CourseVO;

import java.util.List;

/**
 * @description 课程服务接口
 * @filename CourseService.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
public interface CourseService {

    /**
     * @description 获取课程列表
     * @param filter 过滤条件
     * @return ResultDomain<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourse> getCourseList(TbCourse filter);

    /**
     * @description 分页获取课程列表
     * @param filter 过滤条件
     * @return ResultDomain<TbCourse> 课程列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourse> getCoursePage(PageRequest<TbCourse> pageRequest);

    /**
     * @description 根据ID获取课程详情
     * @param courseID 课程ID
     * @return ResultDomain<TbCourse> 课程详情
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<CourseVO> getCourseById(String courseID);

    /**
     * @description 创建课程
     * @param course 课程信息
     * @return ResultDomain<TbCourse> 创建结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<CourseVO> createCourse(CourseVO courseVO);

    /**
     * @description 更新课程
     * @param courseVO 课程信息
     * @return ResultDomain<CourseVO> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<CourseVO> updateCourse(CourseVO courseVO);

    /**
     * @description 删除课程
     * @param courseID 课程ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> deleteCourse(String courseID);

    /**
     * @description 更新课程状态
     * @param courseID 课程ID
     * @param status 状态
     * @return ResultDomain<TbCourse> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourse> updateCourseStatus(TbCourse course);

    /**
     * @description 增加课程浏览次数
     * @param courseID 课程ID
     * @return ResultDomain<TbCourse> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> incrementViewCount(String courseID);

    /**
     * @description 增加课程学习人数
     * @param courseID 课程ID
     * @return ResultDomain<TbCourse> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourse> incrementLearnCount(String courseID);

    // ----------------课程章节相关--------------------------------

    /**
     * @description 获取课程章节列表
     * @param courseID 课程ID
     * @return ResultDomain<TbCourseChapter> 章节列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourseChapter> getCourseChapters(String courseID);

    /**
     * @description 根据ID获取章节详情
     * @param chapterID 章节ID
     * @return ResultDomain<TbCourseChapter> 章节详情
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourseChapter> getChapterById(String chapterID);

    /**
     * @description 创建课程章节
     * @param chapter 章节信息
     * @return ResultDomain<TbCourseChapter> 创建结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourseChapter> createChapter(TbCourseChapter chapter);

    /**
     * @description 更新课程章节
     * @param chapter 章节信息
     * @return ResultDomain<TbCourseChapter> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourseChapter> updateChapter(TbCourseChapter chapter);

    /**
     * @description 删除课程章节
     * @param chapterID 章节ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> deleteChapter(String chapterID);

    /**
     * @description 更新章节排序
     * @param chapterID 章节ID
     * @param orderNum 排序号
     * @return ResultDomain<TbCourseChapter> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbCourseChapter> updateChapterOrder(String chapterID, Integer orderNum);

    /**
     * @description 创建课程章节节点
     * @param node 课程章节节点
     * @return ResultDomain<TbCourseNode> 创建结果
     * @author yslg
     * @since 2025-10-22
     */
    ResultDomain<TbCourseNode> createChapterNode(TbCourseNode node);

    /**
     * @description 更新课程章节节点
     * @param node 课程章节节点
     * @return ResultDomain<TbCourseNode> 更新结果
     * @author yslg
     * @since 2025-10-22
     */
    ResultDomain<TbCourseNode> updateChapterNode(TbCourseNode node);

    /**
     * @description 删除课程章节节点
     * @param nodeID 节点ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-22
     */
    ResultDomain<Boolean> deleteChapterNode(String nodeID);
}
