package com.ruoyi.education.service;

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

/**
 * 开课节次安排Service接口
 * 
 * @author ruoyi
 * @date 2024-09-26
 */
public interface IEduCourseScheduleService 
{
    /**
     * 查询开课节次安排
     * 
     * @param scheduleId 开课节次安排主键
     * @return 开课节次安排
     */
    public EduCourseSchedule selectEduCourseScheduleByScheduleId(Long scheduleId);

    /**
     * 查询开课节次安排列表
     * 
     * @param eduCourseSchedule 开课节次安排
     * @return 开课节次安排集合
     */
    public List<EduCourseSchedule> selectEduCourseScheduleList(EduCourseSchedule eduCourseSchedule);

    /**
     * 新增开课节次安排
     * 
     * @param eduCourseSchedule 开课节次安排
     * @return 结果
     */
    public int insertEduCourseSchedule(EduCourseSchedule eduCourseSchedule);

    /**
     * 修改开课节次安排
     * 
     * @param eduCourseSchedule 开课节次安排
     * @return 结果
     */
    public int updateEduCourseSchedule(EduCourseSchedule eduCourseSchedule);

    /**
     * 批量删除开课节次安排
     * 
     * @param scheduleIds 需要删除的开课节次安排主键集合
     * @return 结果
     */
    public int deleteEduCourseScheduleByScheduleIds(Long[] scheduleIds);

    /**
     * 删除开课节次安排信息
     * 
     * @param scheduleId 开课节次安排主键
     * @return 结果
     */
    public int deleteEduCourseScheduleByScheduleId(Long scheduleId);

    /**
     * 根据开课ID查询节次安排
     * 
     * @param classId 开课ID
     * @return 节次安排集合
     */
    public List<EduCourseSchedule> selectScheduleByClassId(Long classId);

    /**
     * 根据开课ID删除节次安排
     * 
     * @param classId 开课ID
     * @return 结果
     */
    public int deleteScheduleByClassId(Long classId);

    /**
     * 查询指定教室的课程安排
     * 
     * @param classroomId 教室ID
     * @param semesterId 学期ID
     * @return 课程安排集合
     */
    public List<EduCourseSchedule> selectScheduleByClassroom(Long classroomId, Long semesterId);

    /**
     * 查询指定教师的课程安排
     * 
     * @param teacherId 教师ID
     * @param semesterId 学期ID
     * @return 课程安排集合
     */
    public List<EduCourseSchedule> selectScheduleByTeacher(Long teacherId, Long semesterId);

    /**
     * 查询指定学期的所有课程安排
     * 
     * @param semesterId 学期ID
     * @return 课程安排集合
     */
    public List<EduCourseSchedule> selectScheduleBySemester(Long semesterId);

    /**
     * 检查时间冲突
     * 
     * @param eduCourseSchedule 节次安排
     * @return 结果
     */
    public String checkTimeConflict(EduCourseSchedule eduCourseSchedule);

    /**
     * 检查教室时间冲突
     * 
     * @param eduCourseSchedule 节次安排
     * @return 结果
     */
    public String checkClassroomTimeConflict(EduCourseSchedule eduCourseSchedule);

    /**
     * 检查教师时间冲突
     * 
     * @param eduCourseSchedule 节次安排
     * @return 结果
     */
    public String checkTeacherTimeConflict(EduCourseSchedule eduCourseSchedule);

    /**
     * 校验节次设置是否合理
     * 
     * @param eduCourseSchedule 节次安排
     * @return 结果
     */
    public String checkPeriodValid(EduCourseSchedule eduCourseSchedule);

    /**
     * 生成课表数据 - 按教室
     * 
     * @param classroomId 教室ID
     * @param semesterId 学期ID
     * @return 课表数据
     */
    public List<EduCourseSchedule> generateClassroomTimetable(Long classroomId, Long semesterId);

    /**
     * 生成课表数据 - 按教师
     * 
     * @param teacherId 教师ID
     * @param semesterId 学期ID
     * @return 课表数据
     */
    public List<EduCourseSchedule> generateTeacherTimetable(Long teacherId, Long semesterId);

    /**
     * 批量添加节次安排
     * 
     * @param classId 开课ID
     * @param scheduleList 节次安排列表
     * @return 结果
     */
    public int batchAddSchedule(Long classId, List<EduCourseSchedule> scheduleList);

    /**
     * 复制节次安排
     * 
     * @param sourceClassId 源开课ID
     * @param targetClassId 目标开课ID
     * @return 结果
     */
    public int copySchedule(Long sourceClassId, Long targetClassId);

    /**
     * 自动排课
     * 
     * @param classId 开课ID
     * @param semesterId 学期ID
     * @param courseHours 课程总学时
     * @return 结果
     */
    public String autoSchedule(Long classId, Long semesterId, Integer courseHours);

    /**
     * 获取时间段统计信息
     * 
     * @param semesterId 学期ID
     * @return 统计结果
     */
    public Object getTimeSlotStatistics(Long semesterId);

    /**
     * 检查周次范围是否合理
     * 
     * @param weeks 周次字符串
     * @return 结果
     */
    public String checkWeeksValid(String weeks);
}