package com.yonge.cooleshow.biz.dal.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
import com.yonge.cooleshow.biz.dal.vo.*;
import org.apache.ibatis.annotations.Param;

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

/**
 * 老师课程表(CourseSchedule)表数据库访问层
 *
 * @author hgw
 * @since 2022-03-18 15:29:11
 */
public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {

    int insertBatch(@Param("entities") List<CourseSchedule> entities);

    /***
     * 查询所有老师课时统计
     * @author liweifan
     * @updateTime 2022/3/28 10:53
     * @return: com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo
     */
    List<TeacherTotalVo> queryTeacherTotal();

    /***
     * 查询所有学生课时统计
     * @author liweifan
     * @updateTime 2022/3/28 10:53
     * @return: com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo
     */
    List<StudentTotalVo> queryStudentTotal();

    /**
     * 根据学生id查询课程
     *
     * @param param 传入参数
     *              <p> - studentId 学生id
     *              <p> - status 课程状态 NOT_START未开始 ING进行中 COMPLETE已完成
     *              <p> - classDate  年月日
     *              <p> - startClassDate 开始时间-年月日
     *              <p> - endClassDate 结束时间-年月日
     *              <p> - greaterDate 上课时间大于该时间-年月日时分秒
     */
    List<CourseSchedule> queryStudentCourse(@Param("param") Map<String, Object> param);

    /**
     * 查询老师直播课程
     *
     * @param param 传入参数
     *              <p> - teacherId 老师id
     *              <p> - status 课程状态 NOT_START未开始 ING进行中 COMPLETE已完成
     *              <p> - type  PRACTICE 陪练课 LIVE 直播课
     *              <p> - startDate 开始时间
     *              <p> - endDate 结束时间
     *              <p> - subjectId 声部id
     */
    <T> IPage<T> queryLiveTeacherCourse(Page<T> page, @Param("param") Map<String, Object> param);

    //根据老师id查询购课学员
    List<MyCourseVo> queryTeacherPracticeCourse(IPage page, @Param("param") MyCourseSearch query);


    /**
     * 老师未布置的课程作业数量
     * <p>
     * 陪练课 课程状态为完成，有学生考勤记录 没有布置作业
     *
     * @param param 查询条件
     * @return number
     */
    Integer countTeacherNoDecorateHomework(@Param("param") HomeworkSearch param);

    //查询老师约课日历
    Set<String> queryCourseSchedule(MyCourseSearch search);

    //根据学生id查询老师
    List<MyCourseVo> queryStudentPracticeCourse(IPage<MyCourseVo> page, @Param("param") MyCourseSearch search);

    //查询学生约课日历
    Set<String> queryCourseScheduleStudent(MyCourseSearch search);

    //老师端-课表-日历-用户
    List<CourseStudent> queryCourseUser(@Param("param") MyCourseSearch search);

    //学生端-首页-陪练课老师列表
    List<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, @Param("param") PracticeTeacherSearch search);

    //学生端-课表-日历-用户
    List<CourseStudent> queryCourseTeacher(@Param("param") MyCourseSearch search);

    //新增组
    void addCourseGroup(PracticeScheduleDto scheduleDto);

    /**
     * 学生-查询直播课
     *
     * @param param <p> - studentId 学生id
     *              <p> - courseState 课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消
     *              <p> - startDate 开始时间
     *              <p> - endDate 结束时间
     *              <p> - subjectId 声部id
     *              <p> - type PRACTICE 陪练课 LIVE 直播课
     *              <p> - orderState OrderStatusEnum支付状态
     */
    <T> IPage<T> queryStudentLiveCourse(Page<T> page, @Param("param") Map<String, Object> param);

    //更新lock
    void updateLock(List<Long> list);

    //根据课程id修改时间
    void courseAdjust(CourseAdjustVo adjustVo);

    //学生端-首页-直播课
    List<StudentHomePage.Live> selectLive();

    //学生端-首页-视频课
    List<StudentHomePage.Video> selectVideo();

    //学生端-首页-最近一堂课
    StudentHomePage.RecentCourses selectRecentCourses(Long studentId);
}

