package com.ym.mec.biz.dal.dao;

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

import org.apache.ibatis.annotations.Param;

import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
import com.ym.mec.biz.dal.dto.ConditionDto;
import com.ym.mec.biz.dal.dto.CourseListDto;
import com.ym.mec.biz.dal.dto.HighClassGroupDto;
import com.ym.mec.biz.dal.dto.MusicGroupClassGroupDto;
import com.ym.mec.biz.dal.dto.MusicGroupCourseScheduleDto;
import com.ym.mec.biz.dal.dto.StudentPayInfoDto;
import com.ym.mec.biz.dal.dto.SuperClassGroupDto;
import com.ym.mec.biz.dal.dto.TeacherClassGroupDto;
import com.ym.mec.biz.dal.dto.TeacherMusicClassInfoDto;
import com.ym.mec.biz.dal.entity.ClassGroup;
import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
import com.ym.mec.biz.dal.enums.GroupType;
import com.ym.mec.biz.dal.enums.YesOrNoEnum;
import com.ym.mec.common.dal.BaseDAO;
import com.ym.mec.common.entity.ImGroupModel;
import com.ym.mec.common.entity.ImUserModel;

public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {

    /**
     * 查询老师乐团课课程
     *
     * @param teacherId
     * @return
     */
    List<ClassGroup> findClassGroup4Teacher(@Param("teacherId") Integer teacherId);

    /**
     * 获取所有合奏班
     *
     * @return
     */
    List<ClassGroup> findAllMixClassGroup(@Param("musicGroupId") String musicGroupId);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroup>
     * @Author: Joburgess
     * @Date: 2019/10/8
     * @params [musicGroupId]
     * @describe 获取所有班级
     */
    List<ClassGroup> findAllClassGroupByMusicGroup(@Param("musicGroupId") String musicGroupId, @Param("classGroupType") String classGroupType);

    /**
     * 根据合奏班ID查询该合奏班下的子班级
     *
     * @param mixClassGroupId
     * @return
     */
    List<ClassGroup> findMixClassChildClassGroup(@Param("mixClassGroupId") Integer mixClassGroupId);

    /**
     * 根据乐团编号查询单技班级信息
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroup> findAllNormalClassGroupByMusicGroupId(@Param("musicGroupId") String musicGroupId);

    /**
     * 查询合奏班包含子班的名字信息
     *
     * @param classGroupId
     * @return
     */
    ClassGroup findMixClassChildClassGroupNames(@Param("classGroupId") int classGroupId);

    /**
     * 跟班级ids查询班级信息
     *
     * @param ids
     * @return
     */
    List<ClassGroup> findClassGroupByIds(@Param("ids") String ids);

    /**
     * @param classGroupIds: 班级编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroup>
     * @describe 获取班级列表
     * @author Joburgess
     * @date 2020/2/20
     */
    List<ClassGroup> findClassGroupWithIds(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * 根据教师编号获取教师所在乐团，带了哪些班级
     *
     * @param params
     * @return
     */
    List<TeacherMusicClassInfoDto> queryGroupCourses(Map<String, Object> params);

    /**
     * COUNT教师所在乐团带了哪些班级
     *
     * @param params
     * @return
     */
    int countGroupCourses(Map<String, Object> params);


    /**
     * 获取乐团所有班级列表
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroupTeachersDto> findClassGroupByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("type") String type, @Param("classGroupId") Integer classGroupId);

    /**
     * 获取学员所在乐团群组信息
     *
     * @param userId
     * @param search
     * @return
     */
    List<ImGroupModel> queryUserMusicGroups(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取学员所在VIP群组信息
     *
     * @param userId
     * @param search
     * @return
     */
    List<ImGroupModel> queryUserVipGroups(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取学员所在网管课群组信息
     *
     * @param userId
     * @param search
     * @return
     */
    List<ImGroupModel> queryUserPracticeGroups(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取学员所在对外群组信息
     *
     * @param userId
     * @param search
     * @return
     */
    List<ImGroupModel> queryUserCommGroups(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取vip课的学生名称列表
     *
     * @param vipIds
     * @return
     */
    List<Map<String, String>> findVipStuNames(@Param("vipIds") String vipIds, @Param("groupType") String groupType);

    /**
     * 获取班级下的学员列表
     *
     * @param classGroupId
     * @return
     */
    List<ImUserModel> findGroupUsers(@Param("classGroupId") Integer classGroupId, @Param("search") String search);

    /**
     * count学员购买列表
     *
     * @param params
     * @return
     */
    int countStudentPayLog(Map<String, Object> params);

    /**
     * 分页查询学员购买列表
     *
     * @param params
     * @return
     */
    List<StudentPayInfoDto> queryStudentPayLog(Map<String, Object> params);

    /**
     * @return int
     * @Author: Joburgess
     * @Date: 2019/10/3
     * @params [classGroupId]
     * @describe 统计班级人数
     */
    int countClassStudent(Long classGroupId);

    /**
     * 班级增加学生人数
     *
     * @param classGroup
     * @return
     */
    int addStudentNum(@Param("classGroup") ClassGroup classGroup);

    /**
     * 获取当前班级老师id列表
     *
     * @param id
     * @return
     */
    Set<Integer> queryTeacherIds(String id);

    /**
     * 获取当前班级老师数量
     *
     * @param classGroupId
     * @return
     */
    Integer countTeacherNum(String classGroupId);

    /**
     * 获取老师所在班级群组列表
     *
     * @param userId
     * @param search
     * @return
     */
    List<ImGroupModel> queryTeacherGroups(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取员工离职时需要退出的群组列表
     *
     * @param userId
     * @return
     */
    List<ImGroupModel> queryTeacherQuitGroups(@Param("userId") Integer userId);

    /**
     * 获取教务老师关联的群列表
     *
     * @param userId
     * @return
     */
    List<ImGroupModel> queryEducationGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);

    /**
     * 获取运营主管关联的群列表
     *
     * @param userId
     * @return
     */
    List<ImGroupModel> queryTeamTeacherGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);

    /**
     * 获取乐队指导关联的群列表
     *
     * @param userId
     * @return
     */
    List<ImGroupModel> queryDirectorGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);

    /**
     * 获取未分配合奏的单技班列表
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroup> findNoClassSubjects(String musicGroupId);

    /**
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @Author: Joburgess
     * @Date: 2019/10/16
     * @params [vipGroupId]
     * @describe 根据小课获取关联的班级信息
     */
    ClassGroup findByVipGroup(@Param("vipGroupId") Long vipGroupId,
                              @Param("delFlag") Integer delFlag);

    /**
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @Author: Joburgess
     * @Date: 2019/10/16
     * @params [classGroupId]
     * @describe 锁定班级信息
     */
    ClassGroup lockClassGroup(Integer classGroupId);

    /**
     * 获取当前班级列表老师数量
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, Integer>> countTeacherNums(@Param("classGroupIds") String classGroupIds);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
     * @Author: Joburgess
     * @Date: 2019/10/17
     * @params [teacherId]
     * @describe 获取老师乐团班级
     */
    List<TeacherClassGroupDto> findTeacherMusicClassGroup(@Param("teacherId") Long teacherId);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
     * @Author: Joburgess
     * @Date: 2019/10/17
     * @params [teacherId]
     * @describe 获取老师陪练课班级
     */
    List<TeacherClassGroupDto> findTeacherPracticeClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);

    /**
     * 根据老师编号列表获取小课数量
     *
     * @param teacherIds
     * @return
     */
    List<Map<Integer, Integer>> countTeacherVipNum(String teacherIds);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
     * @Author: Joburgess
     * @Date: 2019/10/17
     * @params [teacherId]
     * @describe 获取老师vip课班级
     */
    List<TeacherClassGroupDto> findTeacherVipClassGroup(@Param("teacherId") Long teacherId, @Param("status") String status);

    /**
     * 根据合奏班编号列表，获取单技班名称列表
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, String>> queryNamesByClassId(@Param("classGroupIds") String classGroupIds);

    /**
     * @param classGroupId: 班级编号
     * @return java.util.List<java.lang.Integer>
     * @describe 查询班级下所有学生的部门编号列表
     * @author Joburgess
     * @date 2019/10/21
     */
    List<Integer> findStudentOrganIdsByClassGroup(Long classGroupId);

    /**
     * 乐团详情--班级详情列表
     *
     * @param params
     * @return
     */
    List<MusicGroupClassGroupDto> queryMusicGroupClassGroup(Map<String, Object> params);

    /**
     * COUNT乐团详情--班级详情列表
     *
     * @param params
     * @return
     */
    int countMusicGroupClassGroup(Map<String, Object> params);

    /**
     * 根据班级编号列表，获取老师名字
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, String>> countStudentNum(@Param("classGroupIds") String classGroupIds, @Param("teacherRole") String teacherRole);

    /**
     * 根据班级编号列表，获取班级在读人数
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, Integer>> countStudyNum(@Param("classGroupIds") String classGroupIds);

    /**
     * 根据班级编号列表，获取班级退班人数
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, Integer>> countQuitNum(@Param("classGroupIds") String classGroupIds);

    /**
     * 获取乐团详情---课酬调整
     *
     * @param params
     * @return
     */
    List<MusicGroupCourseScheduleDto> queryMusicGroupCourseSchedule(Map<String, Object> params);

    /**
     * COUNT乐团详情---课酬调整
     *
     * @param params
     * @return
     */
    int countMusicGroupCourseSchedule(Map<String, Object> params);

    /**
     * 获取乐团详情---课表详情列表
     *
     * @param params
     * @return
     */
    List<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(Map<String, Object> params);

    /**
     * COUNT乐团详情---课表详情列表
     *
     * @param params
     * @return
     */
    int countMusicGroupCourseScheduleDetail(Map<String, Object> params);

    /**
     * 根据班级编号列表获取班级名称
     *
     * @param classGroupIds
     * @return
     */
    List<Map<Integer, String>> findNameById(String classGroupIds);

    /**
     * 获取学员班级列表
     *
     * @param musicGroupId
     * @param teacherId
     * @return
     */
    List<ConditionDto> queryStudentClassGroup(@Param("musicGroupId") String musicGroupId, @Param("teacherId") Integer teacherId);

    /**
     * 批量新增班级上的课次数
     *
     * @param classGroupList
     * @return
     */
    int batchIncreaseClassTimes(List<Integer> classGroupList);

    /**
     * 获取学生端，vip课程列表
     *
     * @param musicGroupIds
     * @return
     */
    List<CourseListDto> queryStudentVipCourses(@Param("musicGroupIds") String musicGroupIds, @Param("userId") Integer userId);

    /**
     * 获取学生端,学员乐团课列表详情
     *
     * @param musicGroupIds
     * @return
     */
    List<CourseListDto> queryStudentMusicGroupCourses(@Param("musicGroupIds") String musicGroupIds, @Param("userId") Integer userId);

    /**
     * 获取学生端,学员陪练课列表详情
     *
     * @param musicGroupIds
     * @return
     */
    List<CourseListDto> queryStudentPracticeCourses(@Param("musicGroupIds") String musicGroupIds);

    /**
     * 查询对应类型所有班级列表
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroup> findClassGroups(@Param("musicGroupId") String musicGroupId);

    /**
     * 查询对应类型所有班级列表
     *
     * @param musicGroupId
     * @param type
     * @return
     */
    List<ClassGroup> findClassGroupByMusicGroupIdAndType(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type);

    /**
     * 根据合奏班id获取子班及老师
     *
     * @param mixClassGroupId
     * @return
     */
    List<ClassGroupTeachersDto> findClassGroupByMixClassGroupId(@Param("mixClassGroupId") Integer mixClassGroupId);

    /**
     * @param classGroups: 班级编号列表
     * @return java.util.List<java.lang.String>
     * @describe 根据班级编号列表获取班级名称列表
     * @author Joburgess
     * @date 2019/10/31
     */
    List<String> findClassGroupNamesByClassGroups(@Param("classGroups") List<Integer> classGroups);

    /**
     * 获取当前班级相关的老师列表
     *
     * @param groupId
     * @return
     */
    Set<Integer> findGroupTeacher(Integer groupId);

    /**
     * @param courseScheduleIds: 课程编号列表
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @describe 根据课程获取班级信息
     * @author Joburgess
     * @date 2019/11/4
     */
    List<ClassGroup> findByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param courseScheduleId: 课程编号
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @describe 根据课程获取班级信息
     * @author Joburgess
     * @date 2019/11/4
     */
    ClassGroup findByCourseSchedule(@Param("courseScheduleId") Integer courseScheduleId, @Param("delFlag") Integer delFlag);

    /**
     * @param maxCourseScheduleId: 合奏班编号
     * @return java.util.List<java.lang.Integer>
     * @describe 获取合奏班下所有子班级
     * @author Joburgess
     * @date 2019/11/5
     */
    List<ClassGroup> findClassGroupsByMixClassGroup(Integer maxCourseScheduleId);

    /**
     * 根据乐团跟声部获取提高班列表
     *
     * @param musicGroupId
     * @param subjectId
     * @return
     */
    List<HighClassGroupDto> findClassGroupByMusicGroupIdAndSubjectId(@Param("musicGroupId") String musicGroupId, @Param("subjectId") Integer subjectId);

    int batchUpdateClassGroupCourseTimes(@Param("classGroupCourseTimes") Map<Integer, Integer> classGroupCourseTimes);

    /**
     * @param classGroups:
     * @return int
     * @describe
     * @author Joburgess
     * @date 2020/2/20
     */
    int batchUpdate(@Param("classGroups") List<ClassGroup> classGroups);

    /**
     * 批量软删除班级
     *
     * @param classGroupIds
     * @return
     */
    int batchSoftDelete(@Param("classGroupIds") List<Integer> classGroupIds);


    /**
     * @param musicGroupId: 编号
     * @param groupType:    类型
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @describe 根据乐团编号和类型获取班级
     * @author Joburgess
     * @date 2019/11/17
     */
    ClassGroup findByMusicGroupAndType(@Param("musicGroupId") String musicGroupId,
                                       @Param("groupType") String groupType);

    /**
     * @param musicGroupId: 编号
     * @param groupType:    类型
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @describe 根据乐团编号和类型获取班级
     * @author Joburgess
     * @date 2019/11/17
     */
    ClassGroup lockByMusicGroupAndType(@Param("musicGroupId") String musicGroupId,
                                       @Param("groupType") String groupType);

    /**
     * @param musicGroupIds: 编号列表
     * @param groupType:     类型
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @describe 根据乐团编号和类型获取班级
     * @author Joburgess
     * @date 2019/11/17
     */
    List<ClassGroup> findByMusicGroupsAndType(@Param("musicGroupIds") List<String> musicGroupIds,
                                              @Param("groupType") String groupType);

    /**
     * 按类型获取班级
     *
     * @param musicGroupId
     * @param type
     * @return
     */
    List<ClassGroupTeachersDto> findClassGroupByType(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type);

    /**
     * @param groupIds:  乐团或vip课编号
     * @param groupType: 类型
     * @return java.util.List<java.util.Map < java.lang.String, java.lang.Integer>>
     * @describe 统计指定乐团或vip课的总课次
     * @author Joburgess
     * @date 2019/11/21
     */
    List<Map<String, Integer>> countGroupTotalClassTimes(@Param("groupIds") List<String> groupIds,
                                                         @Param("groupType") String groupType);

    /**
     * @param groupIds:  乐团或vip课编号
     * @param groupType: 类型
     * @return java.util.List<java.util.Map < java.lang.String, java.lang.Integer>>
     * @describe 统计指定乐团或vip课的已上课次
     * @author Joburgess
     * @date 2019/11/21
     */
    List<Map<String, Integer>> countGroupOverClassTimes(@Param("groupIds") List<String> groupIds,
                                                        @Param("groupType") String groupType);

    /**
     * @param classGroupIds: 班级编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroup>
     * @describe 获取班级列表
     * @author Joburgess
     * @date 2019/11/21
     */
    List<ClassGroup> findByClassGroupIds(@Param("classGroupIds") List<Integer> classGroupIds, @Param("lockFlag") Integer lockFlag);

    List<ImGroupModel> queryStudentGroup();

    List<ImGroupModel> queryTeacherGroup();

    List<ImUserModel> queryImUser();

    /**
     * 批量更新班级学生数减一
     *
     * @param classGroupIdList
     * @return
     */
    int batchUpdateStudentNumMinusOne(@Param("classGroupIds") List<Integer> classGroupIdList);

    int updateTest(@Param("delFlag") YesOrNoEnum delFlag);

    /**
     * @param groupId:   乐团编号
     * @param groupType: 乐团类型
     * @return com.ym.mec.biz.dal.entity.ClassGroup
     * @describe 根据乐团编号和类型获取班级
     * @author Joburgess
     * @date 2019/12/11
     */
    ClassGroup findByGroupAndType(@Param("groupId") String groupId,
                                  @Param("groupType") String groupType);

    /**
     * @param params: 查询条件
     * @return java.util.List<com.ym.mec.biz.dal.dto.SuperClassGroupDtio>
     * @describe 终极班级查询
     * @author Joburgess
     * @date 2019/12/30
     */
    List<SuperClassGroupDto> superFindClassGroups(Map<String, Object> params);

    int superCountClassGroups(Map<String, Object> params);

    /**
     * @param search:
     * @return java.util.List<java.lang.Integer>
     * @describe 根据关键字查询学生相关的班级编号
     * @author Joburgess
     * @date 2019/12/31
     */
    List<Integer> findClassGroupIdsByStudent(@Param("search") String search);

    /**
     * @param search:
     * @return java.util.List<java.lang.Integer>
     * @describe 根据关键字查询教师相关的班级编号
     * @author Joburgess
     * @date 2019/12/31
     */
    List<Integer> findClassGroupIdsByTeacher(@Param("search") String search);

    /**
     * 获取基础技能版数量
     *
     * @param musicGroupId
     * @return
     */
    Integer countClassNumByType(String musicGroupId);

    /**
     * 获取对应班级的声部名称列表
     *
     * @param courseScheduleIds
     * @return
     */
    List<Map<Integer, String>> findClassGroupSubjectNameMaps(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param groupId:
     * @param groupType:
     * @return int
     * @describe 根据团体删除班级
     * @author Joburgess
     * @date 2020/2/17
     */
    int deleteByGroup(@Param("groupId") String groupId,
                      @Param("groupType") GroupType groupType);

    /**
     * @param groupId:
     * @param groupType:
     * @return int
     * @describe 根据团体删除班级-逻辑删除
     * @author Joburgess
     * @date 2020/3/4
     */
    int deleteByGroupWithLogic(@Param("groupId") String groupId,
                               @Param("groupType") GroupType groupType);

    /**
     * 获取vip所有班级列表
     *
     * @param vipGroupIds
     * @return
     */
    Set<Integer> queryClassGroupIds(@Param("vipGroupIds") Set<Long> vipGroupIds);

    /**
     * 根据群编号，修改群名称
     *
     * @param groupId
     * @param groupName
     */
    void updateGroupName(@Param("groupId") Integer groupId, @Param("groupName") String groupName);

    /**
     * 获取进行中乐团报名中基础技能班
     *
     * @param musicGroupId
     * @param subjectId
     * @param type
     * @return
     */
    List<HighClassGroupDto> findHighClassGroupByTypeAndSubjectId(@Param("musicGroupId") String musicGroupId, @Param("subjectId") Integer subjectId, @Param("type") String type, @Param("classGroupIds") String classGroupIds);

    /**
     * 根据班级id获取基础技能班
     *
     * @param musicGroupId
     * @param classGroupIds
     * @return
     */
    List<HighClassGroupDto> findHighClassGroup(@Param("musicGroupId") String musicGroupId, @Param("classGroupIds") String classGroupIds);

    /**
     * 获取班级列表
     *
     * @param practiceGroupId
     * @param groupType
     * @return
     */
    List<ClassGroup> queryClassGroups(@Param("practiceGroupId") String practiceGroupId, @Param("groupType") String groupType);

    /**
     * 根据班级编号冻结所选班级
     *
     * @param classGroupIds
     * @param lockFlag
     * @return
     * @author zouxuan
     */
    int batchUpdateLockByClassGroupIds(@Param("classGroupIds") List<Integer> classGroupIds, @Param("lockFlag") int lockFlag);


    /**
     * 获取乐团某声部基础技能班或基础技能提高班数量
     *
     * @return
     */
    Integer getMusicGroupHighClassNumBySubject(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type);

    /**
     * count班级数量
     * @param params
     * @return
     */
    int countClassGroup(Map<String, Object> params);

    /**
     * 获取班级列表
     * @param params
     * @return
     */
    List<ClassGroupTeachersDto> queryClassGroupPage(Map<String, Object> params);
}
