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.search.*;
import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
import com.yonge.cooleshow.biz.dal.entity.Subject;
import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroupDetail;
import com.yonge.cooleshow.biz.dal.vo.*;
import org.apache.ibatis.annotations.Param;

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

/**
 * 课程组表(CourseGroup)表数据库访问层
 *
 * @author hgw
 * @since 2022-03-18 15:29:10
 */
public interface CourseGroupDao extends BaseMapper<CourseGroup> {

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

    /**
     * 老师端-分页查询课程组信息
     */
    IPage<CourseGroupVo> queryTeacherCourseGroup(Page<CourseGroupVo> page, @Param("param") Map<String, Object> param);

    /**
     * 学生端-分页查询课程组信息
     */
    IPage<CourseGroupVo> queryStudentCourseGroup(Page<CourseGroupVo> page, @Param("param") Map<String, Object> param);

    /**
     * 平台方 老师详情直播课列表
     *
     * @param page  分页信息
     * @param query 查询条件
     * @return page
     */
    IPage<LiveCourseGroupVo> selectAdminLivePage(@Param("page") IPage<LiveCourseGroupVo> page, @Param(
            "param") LiveCourseGroupSearch query);

    /**
     * 获取课程组声部
     *
     * @param courseGroupIdList 课程组id集合
     * @return 声部信息
     */
    List<LiveCourseGroupVo> selectCourseGroupSubject(@Param("courseGroupIdList") List<Long> courseGroupIdList);

    /**
     * 直播课购买学生信息
     *
     * @param page  分页
     * @param query 查询条件
     * @return page
     */
    IPage<LiveCourseGroupStudentVo> selectAdminLiveStudentPage(@Param("page") IPage<LiveCourseGroupStudentVo> page, @Param("param") LiveCourseGroupStudentSearch query);

    /**
     * 直播课程详情 课程计划
     *
     * @param courseGroupId 课程组id
     * @return
     */
    List<LiveCourseGroupPlanVo> selectAdminLivePlan(@Param("courseGroupId") Long courseGroupId);

    /**
     * 课程组人数增加或减少
     *
     * @param id 课程组id
     */
    int opsPreStudentNum(@Param("id") Long id, @Param("num") Integer num);

    /**
     * 查询课程组详情
     *
     * @param courseGroupId 课程组id
     * @return
     */
    LiveCourseGroupVo selectAdminLiveCourseGroup(@Param("courseGroupId") Long courseGroupId);

    /**
     * 查询直播详情 直播课学生到课状态
     *
     * @param page  分页
     * @param query 查询条件
     * @return
     */
    IPage<LiveCourseGroupStudentCourseVo> selectAdminLiveStudentCoursePage(@Param("page") IPage<LiveCourseGroupStudentCourseVo> page,
                                                                           @Param("param") LiveCourseGroupStudentCourseSearch query);

    /**
     * 查询陪练课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPracticeVo> selectPracticeGroup(@Param("page") IPage<CourseGroupPracticeVo> page,
                                                     @Param("param") CourseGroupSearch search);

    /**
     * 查询陪练课-详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPracticeDetailVo> selectPracticeGroupDetail(@Param("page") IPage<CourseGroupPracticeDetailVo> page,
                                                                 @Param("param") CourseGroupDetailSearch search);

    /**
     * 查询直播课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupLiveVo> selectLiveGroup(@Param("page") IPage<CourseGroupLiveVo> page,
                                             @Param("param") CourseGroupSearch search);

    /**
     * 查询直播课购买学员
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseSchedulePaymentVo> selectLiveGroupStudent(@Param("page") IPage<CourseSchedulePaymentVo> page,
                                                          @Param("param") CourseGroupSearch search);

    /**
     * 查询直播课教学计划
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseSchedulePlanVo> selectLiveGroupPlan(@Param("page") IPage<CourseSchedulePlanVo> page,
                                                    @Param("param") CourseGroupSearch search);

    /**
     * 查询视频课
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupVideoVo> selectVideoGroup(@Param("page") IPage<CourseGroupVideoVo> page,
                                               @Param("param") CourseGroupSearch search);

    /**
     * 查询视频课购课学员
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupStudentVo> selectVideoGroupStudent(@Param("page") IPage<CourseGroupStudentVo> page,
                                                        @Param("param") CourseGroupSearch search);

    /**
     * 查询视频课教学计划
     *
     * @param page
     * @param search
     * @return
     */
    IPage<VideoLessonGroupDetail> selectVideoGroupPlan(@Param("page") IPage<VideoLessonGroupDetail> page,
                                                       @Param("param") CourseGroupSearch search);

    /**
     * 根据组id查详情
     *
     * @param groupId
     * @return
     */
    CourseGroupInfoVo selectGroupInfoVo(Long groupId);

    /**
     * 批量更新组状态
     *
     * @param list
     */
    void updateBatch(List<Long> list);

    /**
     * 查询琴房课组
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoVo> selectPianoGroup(@Param("page") IPage<CourseGroupPianoVo> page,
                                               @Param("param") CourseGroupSearch search);

    /**
     * 查询琴房课详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoDetailVo> selectPianoGroupDetail(@Param("page") IPage<CourseGroupPianoDetailVo> page,
                                                           @Param("param") CourseGroupDetailSearch search);

    /**
     * 查询琴房课学员考勤
     *
     * @param courseId
     * @param type
     * @return
     */
    List<StudentSignVo> studentSign(@Param("courseId") Long courseId, @Param("type") String type);

    /**
     * 根据学员查询琴房课组
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoVo> selectPianoGroupStudent(@Param("page") IPage<CourseGroupPianoVo> page,
                                                      @Param("param") CourseGroupSearch search);

    /**
     * 查询琴房课详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoDetailVo> selectPianoGroupStudentDetail(@Param("page") IPage<CourseGroupPianoDetailVo> page,
                                                                  @Param("param") CourseGroupDetailSearch search);

    /**
     * 根据老师查询琴房课组
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoVo> selectPianoGroupTeacher(@Param("page") IPage<CourseGroupPianoVo> page,
                                                      @Param("param") CourseGroupSearch search);

    /**
     * 查询琴房课详情
     *
     * @param page
     * @param search
     * @return
     */
    IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(@Param("page") IPage<CourseGroupPianoDetailVo> page,
                                                                  @Param("param") CourseGroupDetailSearch search);

    /**
     * 获取直播课报名中的声部
     *
     * @return
     */
    List<Subject> selectLiveSubject();
}

