package com.ym.mec.biz.service;

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.*;
import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
import com.ym.mec.biz.dal.enums.GroupType;
import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
import com.ym.mec.biz.dal.page.*;
import com.ym.mec.common.entity.HttpResponseResult;
import com.ym.mec.common.entity.ImGroupModel;
import com.ym.mec.common.entity.ImUserModel;
import com.ym.mec.common.page.PageInfo;
import com.ym.mec.common.page.QueryInfo;
import com.ym.mec.common.service.BaseService;

import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
	
	public PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo);
	
	boolean create(ClassGroup classGroup);

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

    /**
     * 合奏班相关班级获取
     *
     * @param mixClassGroupId
     * @return
     */
    List<ClassGroup> findClassGroup(String musicGroupId, Integer mixClassGroupId);

    /**
     * 根据乐团编号查询单技班列表
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroup> findAllNormalClassGroupByMusicGroupId(String musicGroupId);


    /**
     * 根据乐团编号查询合奏班列表
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroup> findAllMixClassGroupByMusicGroupId(String musicGroupId);

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

    /**
     * 添加单技班
     *
     * @param classGroup
     * @return
     */
    ClassGroup addClassGroup(ClassGroup classGroup,GroupType groupType) throws Exception;

    /**
     * 添加合奏班
     *
     * @param classGroupIds
     * @return
     * @throws Exception
     */
    ClassGroup addMixClassGroup(String musicGroupId, String name, String classGroupIds) throws Exception;

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


    /**
     * 提高班批量添加
     *
     * @param highClassGroupList
     * @return
     * @throws Exception
     */
    List<HighClassGroupDto> addHighClassGroup(List<HighClassGroupDto> highClassGroupList) throws Exception;

    /**
     * 获取老师乐团课程信息列表
     *
     * @param queryInfo
     * @return
     */
    PageInfo<TeacherMusicClassInfoDto> getTeacherMusicClass(TeacherMusicClassQueryInfo queryInfo);

    /**
     * 获取老师VIP课程信息列表
     *
     * @param queryInfo
     * @return
     */
    PageInfo<TeacherVipClassInfoDto> getTeacherVipClass(VipClassQueryInfo queryInfo);


    /**
     * 获取乐团班级老师课酬
     *
     * @param musicGroupId
     * @param type 班级类型（多种类型）
     * @return
     */
    List<ClassGroupTeachersDto> getClassGroupAndTeachers(String musicGroupId,String type,Integer classGroupId);

    /**
     * 获取乐团班级老师课酬
     *
     * @param musicGroupId
     * @return
     */
    List<ClassGroupTeachersDto> getClassGroupAndTeacherSalary(String musicGroupId, SalarySettlementTypeEnum type,Integer classGroupId) throws Exception;


    /**
     * 获取学生所购买课程列表
     *
     * @param userId
     * @param queryInfo
     * @return
     */
    PageInfo<CourseListDto> queryCoursePage(UserMusicGroupQueryInfo queryInfo,Integer userId);

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

    /**
     * 获取群组下用户基本信息
     * @param groupId
     * @return
     */
    List<ImUserModel> findGroupUsers(Integer groupId,String search);
    /**
     * 获取群组下学员基本信息
     * @param groupId
     * @return
     */
    List<ImUserModel> findGroupStudents(Integer groupId,String search);

    /**
     * 分页查询学生购买记录
     * @param studentPayLogQueryInfo
     * @return
     */
    PageInfo<StudentPayInfoDto> queryStudentPayLog(StudentPayLogQueryInfo studentPayLogQueryInfo);

    /**
     * 班级添加学生
     * @param classGroup
     * @param userId
     * @return
     */
    ClassGroup addStudent(ClassGroup classGroup, Integer userId, GroupType groupType);
    
    /**
     * 添加学生到指定班级并排课
     * @param studentId
     * @param classGroupIdListStr
     * @return
     */
    boolean addStudentToClassGroupAndCourseArranging(Integer studentId, String classGroupIdListStr, String batchNo, List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList);

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

    /**
     * @Author: Joburgess
     * @Date: 2019/10/16
     * @params [classGroupId, num]
     * @return boolean
     * @describe 跟新班级人数
     */
    boolean updateClassStudentNum(Integer classGroupId,Integer num);

    boolean updateClassStudentNum(Integer classGroupId);

    /**
     * 删除单技班级
     * @param classGroupId
     */
    void delSingle(Integer classGroupId);

    /**
     * 删除合奏班级
     * @param classGroupId
     */
    void delMix(Integer classGroupId);

    /**
     * 成团确认，校验参数，并设置团长
     * @param teacherId
     * @param musicGroupId
     */
    void addMusicGroupTeam(Integer teacherId, String musicGroupId,Integer improventClassesNum) throws Exception;

    /**
     * @Author: Joburgess
     * @Date: 2019/10/17
     * @params [type]
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassGroupDto>
     * @describe 获取老师所在班级列表
     */
    List<TeacherClassGroupDto> findTeacherClassGroups(String type,String status);

    /**
     * @Author: Joburgess
     * @Date: 2019/10/18
     * @params @param classGroupId:班级编号
     * @return com.ym.mec.biz.dal.dto.TeacherClassHeadInfo
     * @describe 获取班级信息
     */
    TeacherClassHeadInfo findTeacherClassGroupInfo(Integer classGroupId);

    /**
     * @describe 获取班级对应学生列表
     * @author Joburgess
     * @date 2019/10/18
     * @param queryInfo:
     * @return org.snaker.engine.access.Page
     */
    PageInfo findTeacherClassStudents(CourseScheduleQueryInfo queryInfo);

    /**
     * @describe 根据班级获取点名列表
     * @author Joburgess
     * @date 2019/10/19
     * @param courseScheduleId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceViewDto>
     */
    List<StudentAttendanceViewDto> findAttendanceStudentByCourse(Long courseScheduleId);

    /**
     * @describe 分页查询课程点名列表
     * @author Joburgess
     * @date 2020/1/17
     * @param queryInfo:
     * @return com.ym.mec.common.page.PageInfo
     */
    PageInfo findAttendanceStudentByCourseWithPage(CourseScheduleQueryInfo queryInfo);

    /**
     * 班级调整(新增班级)
     * @param classGroup4MixDto
     * @return
     */
    ClassGroup classGroupAdjust(List<ClassGroup4MixDto> classGroup4MixDto);

    /**
     * 合班拆班新建班级
     * @param classGroup4MixDtos
     * @return
     */
    ClassGroup classGroupAdjust2(ClassGroup4MixDto classGroup4MixDtos);

    /**
     * 班级调整(修改班级)
     * @param classGroup4MixDtos
     * @return
     */
    ClassGroup classGroupUpdate(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;

    /**
     * 班级调整(增加临时班级)
     * @param classGroup4MixDtos
     * @return
     */
    ClassGroup classGroupSnap(List<ClassGroup4MixDto> classGroup4MixDtos) throws Exception;


    /**
     * 乐团详情--班级详情列表
     * @param queryInfo
     * @return
     */
    PageInfo<MusicGroupClassGroupDto> queryMusicGroupClassGroup(QueryInfo queryInfo);

    /**
     * 乐团详情-----课酬调整
     * @param queryInfo
     * @return
     */
    PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseSchedule(queryMusicGroupCourseScheduleQueryInfo queryInfo);

    /**
     * 乐团详情-----课表详情
     * @param queryInfo
     * @return
     */
    PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo);
    
    /**
     * 批量新增班级上的课次数
     * @param classGroupList
     * @return
     */
    boolean batchIncreaseClassTimes(List<Integer> classGroupList);



    List<ClassGroupTeachersDto> classGroupAndTeacher(Integer classGroupId);


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

    /**
     * @describe 批量更新指定班级人数
     * @author Joburgess
     * @date 2019/11/12
     * @param classGroupIds: 班级编号列表
     * @return int
     */
    int batchUpdateClassCourseTimes(List<Integer> classGroupIds);

    /*
     * @describe 将学生加入到班级
     * @author Joburgess
     * @date 2019/11/16
     * @param musicGroupId: 乐团或者VIP课编号
     * @param classGroupId: 班级编号
     * @param studentIds: 学生编号列表
     * @return void
     */
    void addStudentIntoClassGroup(String musicGroupId,Integer classGroupId,List<Integer> studentIds);

    /**
     * 根据乐团id，班级类型获取班级和老师
     * @param musicGroupId
     * @param type
     * @return
     */
    List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type);

    /**
     * 根据乐团id，班级类型获取班级和老师
     * @param queryInfo
     * @return
     */
    PageInfo<ClassGroupTeachersDto> queryClassGroupPage(ClassGroupQueryInfo queryInfo);

    /**
     * 添加IM群组
     * @param classGroup
     * @param userIds
     * @param teacherIdList
     * @return
     */
    Boolean addImGroup(ClassGroup classGroup,List<Integer> userIds, List<Integer> teacherIdList);

    /**
     * 检测是否设置课酬
     * @param musicGroupId
     * @return
     */
    Boolean checkSetSalary(String musicGroupId);

    boolean updateTotalClassTimes(Integer classGroupId, Integer num);

    /**
     * @describe 跟新班级相关信息
     * @author Joburgess
     * @date 2019/12/11
     * @param classGroupId: 班级编号
     * @return void
     */
    void updateClassGroupInfo(Integer classGroupId);

    /**
     * @describe 批量更新班级上的课次信息
     * @author Joburgess
     * @date 2020/2/20
     * @param classGroupIds: 班级编号列表
     * @return void
     */
    void updateClassGroupsCourseInfo(List<Integer> classGroupIds);

    /**
     * 清除班级未开始课程
     * @param classGroupId
     * @return
     */
    boolean delClassNoStartCourse(Integer classGroupId);

    /**
     * 根据群编号，获取群组基本信息
     * @param groupId
     * @return
     */
    ClassGroup findGroupById(Integer groupId);

    /**
     * @describe 终极班级信息获取
     * @author Joburgess
     * @date 2019/12/30
     * @param queryInfo: 查询条件
     * @return com.ym.mec.common.page.PageInfo
     */
    PageInfo endFindClassGroups(EndCourseScheduleQueryInfo queryInfo);

    /**
     *
     * @param groupId
     * @param userId
     * @return
     */
    Map<String,Object> getUserInfoWithUserId(Integer groupId, Integer userId);

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

    /**
     * @params @param courseId:课程编号
     * @return com.ym.mec.biz.dal.dto.TeacherClassHeadInfo
     * @describe 获取班级信息
     */
    TeacherClassHeadInfo findTeacherClassGroupInfoByCourseId(Integer courseId);
    
    /**
     * 查询指定班级剩余未上课程类型的时长
     * @param classGroupIdList
     * @return
     */
    List<RemainCourseTypeDurationDto> queryRemainCourseTypeDuration(String classGroupIdList);

    /**
     * 进行中乐团-修改-班级详情-学员班级调整详情
     * @author zouxuan
     * @param classGroupId
     * @return
     */
    Map<String,Integer> classGroupSubCourseNum(Integer classGroupId);

    /**
     * 进行中乐团-修改-班级详情-学员班级调整-获取所选班级最大可排课时长
     * @author zouxuan
     * @param classGroupIds
     * @return
     */
    Map<String,Object> getDefaultPaymentCalender(List<Integer> classGroupIds);

    /**
     * 进行中乐团-修改-班级详情-学员班级调整-合并结果确认
     * 保存新增班级的基本信息，冻结所选班级的课程，生成同一批次的缴费项目，保存调整详情
     * @author zouxuan
     * @param mergeClassSplitClassAffirmDto
     * @return
     */
    HttpResponseResult mergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws InvocationTargetException, IllegalAccessException, Exception;

    /**
     * 进行中乐团-修改-班级详情-学员班级调整-合并结果确认-获取新班级的可排课时长
     * @author zouxuan
     * @param classGroupIds
     * @return
     */
    Map<String,Long> findClassCourseMinuteMap(List<Integer> classGroupIds,Map<String,Long> classCourseMinuteMap);

    /**
     * 获取基础技能班/线上基础技能班数量和容许最大数量
     * @param musicGroupId
     * @param type
     * @return
     */
    HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId,ClassGroupTypeEnum type);

    /**
     * 进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额
     * @param masterClassGroupId
     * @param classGroupStudents
     * @param studentIds
     * @return
     */
    List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(Integer masterClassGroupId,String classGroupStudents,List<Integer> studentIds);

    /**
     * 获取主班课程类型剩余价值
     * @param masterClassGroupId
     * @return
     */
    BigDecimal getMasterTotalPrice(Integer masterClassGroupId);

    /**
     * 获取班级列表最大可排课时长
     * @param classGroupId
     * @return
     */
    Map<String,Long> querySubCourseTime(Integer classGroupId);

    /**
     * 跨团班级合并提交
     * @param mergeClassSplitClassAffirmDto
     * @return
     */
    HttpResponseResult spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto);

    /**
     * 跨团合班缴费项目审核通过后
     * @param masterClassGroupId
     * @param studentIds
     * @param courseIds
     * @param classGroupStudents
     */
    void spanGroupClassAdjustPass(Integer masterClassGroupId,List<Integer> studentIds,List<Long> courseIds,List<Map> classGroupStudents,List<Long> allLockCourseIds,String batchNo,BigDecimal masterTotalPrice);
}
