package com.dora.mapper;

import com.dora.entity.Course;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * 课程Mapper接口
 */
@Mapper
public interface CourseMapper {
    
    /**
     * 获取热门课程列表
     */
    List<Course> selectHotCourses(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 根据分类获取课程列表
     */
    List<Course> selectCoursesByCategory(@Param("category") String category, 
                                       @Param("offset") int offset, 
                                       @Param("limit") int limit);
    
    /**
     * 根据分类获取课程总数
     */
    Long countCoursesByCategory(@Param("category") String category);
    
    /**
     * 根据分类ID获取课程列表
     */
    List<Course> selectCoursesByCategoryId(@Param("categoryId") Long categoryId, 
                                         @Param("offset") int offset, 
                                         @Param("limit") int limit);
    
    /**
     * 根据类目ID获取课程总数
     */
    Long countCoursesByCategoryId(@Param("categoryId") Long categoryId);
    
    /**
     * 获取课程总数
     */
    Long countAllCourses();
    
    /**
     * 根据ID获取课程详情（不过滤审核状态，用于内部管理）
     */
    Course selectById(@Param("id") Long id);
    
    /**
     * 根据ID获取已审核通过的课程详情（用于用户端）
     */
    Course selectApprovedById(@Param("id") Long id);

    // 注意：外部课程IDexternal_id字段当前库不存在，如需启用请先添加列并实现对应SQL
    
    /**
     * 获取所有分类及其课程数量
     */
    List<CourseCategoryCount> selectCategoryCounts();

    /**
     * 根据创建者分页获取课程
     */
    List<Course> listByOwnerPaged(@Param("ownerId") Long ownerId,
                                  @Param("auditStatus") Integer auditStatus,
                                  @Param("keyword") String keyword,
                                  @Param("offset") int offset,
                                  @Param("limit") int limit);

    /**
     * 统计我的课程数量
     */
    Long countByOwner(@Param("ownerId") Long ownerId,
                      @Param("auditStatus") Integer auditStatus,
                      @Param("keyword") String keyword);
    
    /**
     * 提交课程审核：更新标题/描述，并置为待审核
     */
    int submitForAudit(@Param("id") Long id,
                       @Param("ownerId") Long ownerId,
                       @Param("title") String title,
                       @Param("description") String description,
                       @Param("isFree") Integer isFree,
                       @Param("level") Integer level);
    
    /**
     * 课程分类统计结果
     */
    class CourseCategoryCount {
        private String category;
        private Long count;
        
        public String getCategory() {
            return category;
        }
        
        public void setCategory(String category) {
            this.category = category;
        }
        
        public Long getCount() {
            return count;
        }
        
        public void setCount(Long count) {
            this.count = count;
        }
    }

    /**
     * 插入课程（用于单视频自动创建课程集合）
     */
    int insert(Course course);

    /**
     * 更新课程信息
     */
    int updateById(Course course);

    /**
     * 软删除课程
     */
    int softDelete(@Param("id") Long id, @Param("ownerId") Long ownerId);

    /**
     * 搜索课程
     * @param params 搜索参数，包含keyword、category、freeOnly、offset、limit
     * @return 课程列表
     */
    List<Course> searchCourses(@Param("params") Map<String, Object> params);

    /**
     * 统计搜索课程数量
     * @param params 搜索参数，包含keyword、category、freeOnly
     * @return 课程数量
     */
    Long countSearchCourses(@Param("params") Map<String, Object> params);

    /**
     * 获取课程观看次数
     * @param courseId 课程ID
     * @return 观看次数
     */
    Integer getCourseViewCount(@Param("courseId") Long courseId);

    /**
     * 获取课程点赞次数
     * @param courseId 课程ID
     * @return 点赞次数
     */
    Integer getCourseLikeCount(@Param("courseId") Long courseId);

    /**
     * 获取课程总时长（秒）
     * @param courseId 课程ID
     * @return 总时长（秒）
     */
    Integer getCourseDuration(@Param("courseId") Long courseId);

    /**
     * 数据迁移：将老的category字段同步到category_id字段
     * @return 更新的记录数
     */
    int migrateCategoryToId();
} 