package com.ruoyi.education.service;

import java.util.List;
import com.ruoyi.education.domain.EduCourseClass;

/**
 * 开课计划Service接口
 * 
 * @author ruoyi
 * @date 2024-09-26
 */
public interface IEduCourseClassService 
{
    /**
     * 查询开课计划
     * 
     * @param classId 开课计划主键
     * @return 开课计划
     */
    public EduCourseClass selectEduCourseClassByClassId(Long classId);

    /**
     * 查询开课计划列表
     * 
     * @param eduCourseClass 开课计划
     * @return 开课计划集合
     */
    public List<EduCourseClass> selectEduCourseClassList(EduCourseClass eduCourseClass);

    /**
     * 新增开课计划
     * 
     * @param eduCourseClass 开课计划
     * @return 结果
     */
    public int insertEduCourseClass(EduCourseClass eduCourseClass);

    /**
     * 修改开课计划
     * 
     * @param eduCourseClass 开课计划
     * @return 结果
     */
    public int updateEduCourseClass(EduCourseClass eduCourseClass);

    /**
     * 批量删除开课计划
     * 
     * @param classIds 需要删除的开课计划主键集合
     * @return 结果
     */
    public int deleteEduCourseClassByClassIds(Long[] classIds);

    /**
     * 删除开课计划信息
     * 
     * @param classId 开课计划主键
     * @return 结果
     */
    public int deleteEduCourseClassByClassId(Long classId);

    /**
     * 根据班级编号查询开课计划
     * 
     * @param classCode 班级编号
     * @return 开课计划
     */
    public EduCourseClass selectEduCourseClassByClassCode(String classCode);

    /**
     * 查询指定学期的开课计划
     * 
     * @param semesterId 学期ID
     * @return 开课计划集合
     */
    public List<EduCourseClass> selectCourseClassBySemester(Long semesterId);

    /**
     * 查询指定教师的开课计划
     * 
     * @param teacherId 教师ID
     * @return 开课计划集合
     */
    public List<EduCourseClass> selectCourseClassByTeacher(Long teacherId);

    /**
     * 查询可选课的开课计划
     * 
     * @return 开课计划集合
     */
    public List<EduCourseClass> selectEnrollableCourseClasses();

    /**
     * 发布开课计划（将状态改为可选课）
     * 
     * @param classId 开课计划ID
     * @return 结果
     */
    public int publishCourseClass(Long classId);

    /**
     * 批量发布开课计划
     * 
     * @param classIds 开课计划ID数组
     * @return 结果
     */
    public int batchPublishCourseClass(Long[] classIds);

    /**
     * 停止选课（将状态改为已满额）
     * 
     * @param classId 开课计划ID
     * @return 结果
     */
    public int stopEnrollment(Long classId);

    /**
     * 结课（将状态改为已结课）
     * 
     * @param classId 开课计划ID
     * @return 结果
     */
    public int finishCourse(Long classId);

    /**
     * 校验班级编号是否唯一
     * 
     * @param eduCourseClass 开课计划
     * @return 结果
     */
    public String checkClassCodeUnique(EduCourseClass eduCourseClass);

    /**
     * 校验容量设置是否合理
     * 
     * @param eduCourseClass 开课计划
     * @return 结果
     */
    public String checkCapacityValid(EduCourseClass eduCourseClass);

    /**
     * 校验教室时间冲突
     * 
     * @param eduCourseClass 开课计划
     * @return 结果
     */
    public String checkClassroomConflict(EduCourseClass eduCourseClass);

    /**
     * 校验教师时间冲突
     * 
     * @param eduCourseClass 开课计划
     * @return 结果
     */
    public String checkTeacherConflict(EduCourseClass eduCourseClass);

    /**
     * 更新已选课人数
     * 
     * @param classId 班级ID
     * @param enrolledCount 已选人数
     * @return 结果
     */
    public int updateEnrolledCount(Long classId, Integer enrolledCount);

    /**
     * 调整容量
     * 
     * @param classId 班级ID
     * @param newCapacity 新容量
     * @return 结果
     */
    public int adjustCapacity(Long classId, Integer newCapacity);

    /**
     * 获取开课计划统计信息
     * 
     * @param semesterId 学期ID
     * @return 统计结果
     */
    public Object getCourseClassStatistics(Long semesterId);

    /**
     * 获取课程列表用于下拉选择
     * 
     * @return 课程选项集合
     */
    public List<Object> getCourseOptions();

    /**
     * 获取教师列表用于下拉选择
     * 
     * @return 教师选项集合
     */
    public List<Object> getTeacherOptions();

    /**
     * 获取教室列表用于下拉选择
     * 
     * @return 教室选项集合
     */
    public List<Object> getClassroomOptions();
}