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

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
import com.ym.mec.biz.dal.entity.StudentRegistration;
import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
import com.ym.mec.biz.dal.enums.GroupType;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Param;

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

public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStudentMapper> {

    int batchUpdate(@Param("classGroupStudentMappers") List<ClassGroupStudentMapper> classGroupStudentMappers);

    /**
     * 批量插入学生
     *
     * @param classGroupStudentMapperList
     * @return
     */
    int classGroupStudentsInsert(@Param("classGroupStudentMapperList") List<ClassGroupStudentMapper> classGroupStudentMapperList);

    /**
     * 根据班级和学生编号查询
     *
     * @param classGroupId
     * @param userId
     * @return
     */
    ClassGroupStudentMapper query(@Param("classGroupId") int classGroupId, @Param("userId") Integer userId);

    /**
     * @param classGroupId: 班级编号
     * @param userId:       学员编号
     * @return com.ym.mec.biz.dal.entity.ClassGroupStudentMapper
     * @describe 获取班级上的学员
     * @author Joburgess
     * @date 2019/12/18
     */
    ClassGroupStudentMapper findClassGroupStudent(@Param("classGroupId") int classGroupId, @Param("userId") Integer userId);

    /**
     * 根据乐团编号删除指定学生
     *
     * @param musicGroupId 乐团编号
     * @param userId       学生编号
     * @return
     */
    int deleteStudentByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);

    /**
     * 根据班级编号删除关联
     *
     * @param classGroupId
     */
    void deleteByClassId(Integer classGroupId);

    /**
     * @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/2/17
     */
    int deleteByGroupWithLogic(@Param("groupId") String groupId,
                               @Param("groupType") GroupType groupType);

    /**
     * @return int
     * @Author: Joburgess
     * @Date: 2019/10/17
     * @params [classGroupId, userId]
     * @describe 删除班级上的指定学生
     */
    int deleteStudentByClassGroupId(@Param("classGroupId") Long classGroupId, @Param("userId") Long userId);

    /**
     * @return int
     * @Author: zouxuan
     * @Date: 2019/10/17
     * @params [classGroupId, userId]
     * @describe 删除班级上的指定学生
     */
    int deleteByClassGroupIdAndStudents(@Param("classGroupId") Integer classGroupId, @Param("userIds") String userIds);

    int deleteClassGroupStudent(@Param("classGroupId") Long classGroupId, @Param("userId") Integer userId);

    /**
     * @param classGroupId: 班级编号
     * @return java.lang.String[]
     * @describe 根据班级编号获取班级学生名称列表
     * @author Joburgess
     * @date 2019/10/18
     */
    String[] findStudentNumByClassGroupId(@Param("classGroupId") Integer classGroupId);

    /**
     * @param courseScheduleId:
     * @return java.lang.String[]
     * @describe 获取课程上的学员名称集合
     * @author Joburgess
     * @date 2019/12/4
     */
    String[] findCourseStudentName(@Param("courseScheduleId") Integer courseScheduleId);

    /**
     * @param courseScheduleId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentNameAndPhoneDto>
     * @describe 获取课程上的学员名称和电话
     * @author Joburgess
     * @date 2020/2/16
     */
    List<StudentNameAndPhoneDto> findCourseStudentNameAndPhone(@Param("courseScheduleId") Integer courseScheduleId);

    /**
     * @param params:
     * @return java.util.List<com.ym.mec.biz.dal.dto.TeacherClassStudentDto>
     * @describe 获取班级学生
     * @author Joburgess
     * @date 2019/10/18
     */
    List<TeacherClassStudentDto> findClassStudent(Map<String, Object> params);

    /**
     * @param params:
     * @return int
     * @describe 统计班级学生数量
     * @author Joburgess
     * @date 2019/10/18
     */
    int findClassStudentNum(Map<String, Object> params);

    /**
     * @param courseScheduleId: 课程编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
     * @describe 获取点名列表
     * @author Joburgess
     * @date 2019/10/19
     */
    List<StudentAttendanceViewDto> findStudentByCourse(Long courseScheduleId);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
     * @describe 分页获取点名列表
     * @author Joburgess
     * @date 2019/10/19
     */
    List<StudentAttendanceViewDto> findStudentByCourseWithPage(Map<String, Object> params);

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

    /**
     * 查找班级学生对应关系
     *
     * @param userId
     * @param classGroupId
     * @return
     */
    ClassGroupStudentMapper findClassStudentMapperByUserIdAndClassGroupId(@Param("userId") Integer userId, @Param("classGroupId") Integer classGroupId, @Param("status") String status);

    /**
     * @param classGroupIds: 班级编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
     * @describe 根据班级获取学员
     * @author Joburgess
     * @date 2019/10/24
     */
    List<ClassGroupStudentMapper> findByClassGroups(@Param("classGroupIds") List<Integer> classGroupIds);

    /**
     * @param groupIds:
     * @param groupType:
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
     * @describe 获取团体学员
     * @author Joburgess
     * @date 2020/3/8
     */
    List<ClassGroupStudentMapper> findByGroups(@Param("groupIds") List<String> groupIds,
                                               @Param("groupType") GroupType groupType);

    /**
     * @param classGroupId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
     * @describe 获取指定班级的所有学员
     * @author Joburgess
     * @date 2020.11.04
     */
    List<ClassGroupStudentMapper> findAllByClassGroup(@Param("classGroupId") Long classGroupId);

    /**
     * @param classGroupId: 班级编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
     * @describe 根据班级获取学员
     * @author Joburgess
     * @date 2019/10/24
     */
    List<ClassGroupStudentMapper> findByClassGroup(@Param("classGroupId") Integer classGroupId);

    /**
     * @param groupId:
     * @param groupType:
     * @param classGroupId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
     * @describe 获取团体或者班级上的学员
     * @author Joburgess
     * @date 2020/3/10
     */
    List<ClassGroupStudentInfoDto> findByGroupOrClassGroup(@Param("groupId") String groupId,
                                                           @Param("groupType") GroupType groupType,
                                                           @Param("classGroupId") Integer classGroupId);

    /**
     * 查询班级某状态下所有的学生
     *
     * @param classGroupId
     * @param status
     * @return
     */
    List<StudentRegistration> findClassStudentList(@Param("classGroupId") Integer classGroupId, @Param("status") ClassGroupStudentStatusEnum status);

    /**
     * 查询学生是否已报小班课
     *
     * @param musicGroupId
     * @param userId
     * @param type
     * @return
     */
    List<ClassGroupStudentMapper> findHighClassGroupHasUser(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId, @Param("type") ClassGroupTypeEnum type);

    /**
     * @param userId: 用户编号
     * @param date:   日期
     * @param status: 状态
     * @return java.util.List<java.lang.Integer>
     * @describe 获取学生在指定日期对应状态的班级编号
     * @author Joburgess
     * @date 2019/11/20
     */
    List<Integer> findClassGroupIdByUserAndCourseDateAndStatus(@Param("userId") Integer userId,
                                                               @Param("data") Date date,
                                                               @Param("status") String status);

    /**
     * @param classGroupIds: 班级编号列表
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 统计班级学生人数
     * @author Joburgess
     * @date 2019/11/21
     */
    List<Map<Integer, Integer>> countClassGroupsStudentNum(@Param("classGroupIds") List<Integer> classGroupIds,
                                                           @Param("status") ClassGroupStudentStatusEnum status);

    List<Map<String, Integer>> countGroupAllStudentNum(@Param("groupIds") List<String> groupIds,
                                                       @Param("groupType") GroupType groupType);

    /**
     * @param classGroupId: 班级编号
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.Integer>>
     * @describe 统计班级学生人数
     * @author Joburgess
     * @date 2019/11/21
     */
    Integer countClassGroupStudentNum(@Param("classGroupId") Integer classGroupId);

    /**
     * @param classGroupId:
     * @return java.lang.Integer
     * @describe 统计班级上学生人数，
     * @author Joburgess
     * @date 2019/12/26
     */
    Integer countClassGroupNormalStudentNum(@Param("classGroupId") Integer classGroupId);

    /**
     * @param groupType:
     * @param groupId:
     * @return int
     * @describe 统计课程组上状态正常的学员数量
     * @author Joburgess
     * @date 2020.08.05
     */
    int countGroupNormalStudentNum(@Param("groupType") GroupType groupType,
                                   @Param("groupId") String groupId);

    /**
     * @param groupId:
     * @param groupType:
     * @return java.lang.Integer
     * @describe 统计vip课或乐团下的学生人数
     * @author Joburgess
     * @date 2019/12/14
     */
    Integer countGroupStudentNum(@Param("groupId") String groupId,
                                 @Param("groupType") String groupType);

    /**
     * @param classGroupId: 班级编号
     * @param userIds:      学生编号
     * @return java.lang.Integer
     * @describe 统计指定班级的重复人数
     * @author Joburgess
     * @date 2019/11/22
     */
    Integer countClassGroupExitStudentNum(@Param("classGroupId") Integer classGroupId,
                                          @Param("userIds") List<Integer> userIds);

    /**
     * @param userId:    用户编号
     * @param groupType: 乐团编号
     * @return java.lang.Integer
     * @describe 统计用户对应加入乐团/小课/试听课的数量
     * @author Joburgess
     * @date 2019/11/29
     */
    Integer countUserGroups(@Param("userId") Integer userId,
                            @Param("groupType") String groupType);

    /**
     * 查询学生所在的班级编号
     *
     * @param musicGroupId
     * @param userId
     * @param groupTpye
     * @return
     */
    List<Integer> queryClassGroupIdList(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId, @Param("groupType") GroupType groupType);

    /**
     * 查询乐团某种类型班级的学生
     *
     * @param musicGroupId
     * @param classGroupType
     * @return
     */
    List<ClassGroupStudentMapper> findMusicGroupClassGroupByType(@Param("musicGroupId") String musicGroupId, @Param("classGroupType") ClassGroupTypeEnum classGroupType);

    /**
     * 获取vip课所有学员列表
     *
     * @param vipGroupId
     * @return
     */
    List<Map<Integer, String>> queryStudentIdMap(Long vipGroupId);

    /**
     * 获取vip课所有教师列表
     *
     * @param vipGroupId
     * @return
     */
    List<Map<Integer, String>> queryTeacherIdMap(Long vipGroupId);

    /**
     * @param classGroupId: 班级编号
     * @param userIds:      学生编号列表
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
     * @describe 根据班级和学生编号获取关联记录
     * @author Joburgess
     * @date 2019/12/8
     */
    List<ClassGroupStudentMapper> findByClassGroupAndStudent(@Param("classGroupId") Integer classGroupId,
                                                             @Param("userIds") List<Integer> userIds);

    /**
     * @param groupId:   编号
     * @param groupType: 类型
     * @param status:    状态
     * @return int
     * @describe 批量更新指定乐团或小课下学员状态
     * @author Joburgess
     * @date 2019/12/10
     */
    int updateVipGroupStudentStatus(@Param("groupId") String groupId,
                                    @Param("groupType") String groupType,
                                    @Param("status") String status);

    /**
     * 查询这节课的新学生
     *
     * @param courseScheduleId
     * @return
     */
    List<ClassGroupStudentMapper> queryNewStudentListByCourseScheduleId(Long courseScheduleId);

    /**
     * @param groupId:
     * @param groupType:
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.ClassGroupStudentMapper>
     * @describe 获取课程组上的学生
     * @author Joburgess
     * @date 2020/3/11
     */
    List<ClassGroupStudentMapper> findGroupStudents(@Param("groupId") String groupId,
                                                    @Param("groupType") GroupType groupType,
                                                    @Param("userId") Integer userId,
                                                    @Param("status") ClassGroupStudentStatusEnum status);

    /**
     * 获取学员教务老师
     *
     * @param studentIds
     * @return
     */
    List<StudentEduTeacherDto> getStudentEducationalTeachers(@Param("studentIds") List<Integer> studentIds);

    /**
     * 是否在指定的班级
     *
     * @param classGroupIdListStr
     * @return
     */
    Boolean existByClassGroupIds(@Param("classGroupIdListStr") String classGroupIdListStr, @Param("studentId") Integer studentId);

    /**
     * 获取班级里学员列表
     *
     * @param classGroupId
     * @author zouxuan
     */
    List<StudentNameAndPhoneDto> findCourseStudentNameAndPhoneByClassGroupId(Integer classGroupId);

    /**
     * //主班是否包含所选学员学员
     *
     * @param masterClassGroupId
     * @param studentIds
     * @return
     */
    Boolean hasStudent(@Param("masterClassGroupId") Integer masterClassGroupId, @Param("studentIds") List<Integer> studentIds);

    /**
     * 获取班级关联的学员列表
     * @param classGroupId
     * @return
     */
    Set<Integer> queryStudentIdsByClassGroupId(@Param("classGroupId") Integer classGroupId,@Param("musicGroupId") String musicGroupId,
                                               @Param("groupType") GroupType groupType);
}
