package com.lesingle.edu.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lesingle.edu.dto.request.CourseCreateRequest;
import com.lesingle.edu.dto.request.CourseUpdateRequest;
import com.lesingle.edu.dto.response.CourseResponse;
import com.lesingle.edu.entity.CoursePackage;

import java.util.List;

/**
 * 课程服务接口
 */
public interface CoursePackageService extends com.baomidou.mybatisplus.extension.service.IService<CoursePackage> {

    CoursePackage createCourse(Long tenantId, CourseCreateRequest request);

    CoursePackage createSystemCourse(CourseCreateRequest request);

    CoursePackage updateCourse(Long id, CourseUpdateRequest request);

    CoursePackage getCourseById(Long id);

    /**
     * 获取课程详情（带租户验证）
     * @param id 课程ID
     * @param tenantId 租户ID
     * @return 课程实体
     */
    CoursePackage getCourseByIdWithTenantCheck(Long id, Long tenantId);

    /**
     * 获取课程详情（包含课程环节）
     */
    CourseResponse getCourseByIdWithLessons(Long id);

    Page<CoursePackage> getCoursePage(Long tenantId, Integer pageNum, Integer pageSize, String keyword, String category, String status);

    Page<CoursePackage> getSystemCoursePage(Integer pageNum, Integer pageSize, String keyword, String category, String status, String gradeTags, boolean reviewOnly);

    void deleteCourse(Long id);

    void publishCourse(Long id);

    void archiveCourse(Long id);

    /**
     * 提交课程审核
     */
    void submitCourse(Long id);

    /**
     * 审核驳回课程
     */
    void rejectCourse(Long id, String comment);

    List<CoursePackage> getCoursesByTenantId(Long tenantId);

    /**
     * 查询租户套餐下的课程
     *
     * @param tenantId   租户 ID
     * @param keyword    关键词（课程名称、绘本名称，可选）
     * @param grade      年级筛选（小班/中班/大班，可选）
     * @param domain     领域筛选（健康/语言/社会/科学/艺术 或对应英文码，可选）
     * @param lessonType 课程环节类型筛选（可选）
     */
    List<CoursePackage> getTenantPackageCourses(Long tenantId, String keyword, String grade, String domain, String lessonType);

    /**
     * 按 学校 -> 套餐 -> 课程包 层级分页查询教师可用课程
     * 教师端课程中心应使用此方法，通过租户已购买的套餐获取课程包
     *
     * @param tenantId   租户（学校）ID
     * @param pageNum    页码
     * @param pageSize   每页数量
     * @param keyword    关键词（课程名称、绘本名称，可选）
     * @param grade      年级筛选（小班/中班/大班 或 SMALL/MIDDLE/BIG，可选）
     * @param domain     领域筛选（健康/语言/社会/科学/艺术 或 HEALTH/LANGUAGE/SOCIAL/SCIENCE/ART，可选）
     * @param lessonType 课程环节类型筛选（INTRODUCTION、COLLECTIVE、LANGUAGE、HEALTH、SCIENCE、SOCIAL、ART，可选）
     * @param status     课程状态（如 PUBLISHED）
     */
    Page<CoursePackage> getTenantPackageCoursePage(Long tenantId, Integer pageNum, Integer pageSize,
                                                   String keyword, String grade, String domain, String lessonType, String status);

}
