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

import com.ym.mec.biz.dal.dto.CalenderPushDto;
import com.ym.mec.biz.dal.dto.MusicCardDto;
import com.ym.mec.biz.dal.dto.MusicGroupRegisterDto;
import com.ym.mec.biz.dal.dto.RegisterSubjectDto;
import com.ym.mec.biz.dal.entity.MusicGroup;
import com.ym.mec.biz.dal.entity.School;
import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
import com.ym.mec.common.dal.BaseDAO;
import com.ym.mec.common.entity.ImGroupModel;
import org.apache.ibatis.annotations.Param;

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

public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {

    MusicGroup getLocked(String id);

    /**
     * 获取学员所在乐团详情列表
     *
     * @param userId
     * @return
     */
    List<MusicCardDto> queryUserMusicGroups(Integer userId);

    /**
     * 获取个人中心乐团数据
     *
     * @param userId
     * @return
     */
    MusicCardDto queryPersonalMusicGroups(@Param("userId") Integer userId);

    /**
     * 获取用户有效的乐团数
     *
     * @param userId
     * @return
     */
    Integer countUserMusicGroups(Integer userId);

    /**
     * 根据课程类型获取剩余课时
     *
     * @param userId
     * @param type
     * @return
     */
    Integer countCourseByType(@Param("userId") Integer userId, @Param("type") ClassGroupTypeEnum type);

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

    /**
     * 获取乐团总人数
     *
     * @param musicGroupIds
     * @return
     */
    List<Map<String, BigDecimal>> countMusicGroupUserNum(@Param("musicGroupIds") String musicGroupIds);

    /**
     * 获取乐团所有学员基本信息
     * @param musicGroupId
     * @return
     */
//    List<ImUserModel> findGroupUsers(String musicGroupId);

    /**
     * 获取教师所在乐团列表
     *
     * @param userId
     * @param search
     * @return
     */
    List<ImGroupModel> queryTeacherGroups(@Param("userId") Integer userId, @Param("search") String search);

    /**
     * 获取当前乐团所有教师列表
     * @param musicGroupId
     * @return
     */
//    Set<Integer> queryTeacherIds(String musicGroupId);

    /**
     * 根据乐团编号列表获取乐团在读人数map
     *
     * @param musicGroupIds
     * @return
     */
    List<Map<String, Long>> countPayNum(@Param("musicGroupIds") String musicGroupIds);

    /**
     * 获取乐团列表
     *
     * @param musicGroupIds
     * @return
     */
    List<MusicGroup> queryListByIds(@Param("musicGroupIds") String musicGroupIds);

    /**
     * @param musicGroupIds: 乐团编号列表
     * @return java.util.List<java.util.Map < java.lang.String, java.lang.String>>
     * @describe 根据乐团获取对应的结算方式
     * @author Joburgess
     * @date 2019/11/3
     */
    List<Map<String, String>> findSettlementTypeByMusicGroups(@Param("musicGroupIds") List<String> musicGroupIds);

    /**
     * 查询首页的乐团数量
     *
     * @param ogranId
     * @return
     */
    Map<String, Integer> queryOrganMusicGroupNum(@Param("organId") String ogranId);

    /**
     * 查询本月乐团课程数
     *
     * @param organId
     * @return
     */
    Integer queryCurrentMonthCoursesNum(@Param("organId") String organId);

    /**
     * 获取乐团下的教师map
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Integer, String>> queryTeacherMap(String musicGroupId);

    /**
     * 获取乐团下的教师map
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Integer, String>> queryTeacherIdMap(String musicGroupId);

    /**
     * 根据角色编号获取有权限的用户列表
     *
     * @param roleIds
     * @return
     */
    Set<Integer> queryUserIdByRoleId(@Param("roleIds") Set<Integer> roleIds, @Param("organId") Integer organId);

    /**
     * 获取教务老师时当前用户的乐团
     *
     * @param userIds
     * @return
     */
    String queryEducationalMusicGroupId(Integer userIds);


    /**
     * 查询用户的乐团信息
     *
     * @param userId
     * @return
     */
    MusicGroup findUserMusicGroup(@Param("userId") Integer userId);

    /**
     * @param userId: 用户编号
     * @return com.ym.mec.biz.dal.entity.MusicGroup
     * @describe 查询用户的乐团信息
     * @author Joburgess
     * @date 2020/2/4
     */
    List<MusicGroup> findUserMusicGroups(@Param("userId") Integer userId);

    /**
     * 查询乐团列表
     *
     * @param params
     * @return
     */
    List<MusicGroup> findMusicGroups(Map<String, Object> params);

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

    /**
     * 获取乐团信息
     *
     * @param list
     * @return
     */
    MusicGroup findMusicGroup(List<Long> list);

    /**
     * 获取乐团名称
     *
     * @param musicGroupIds
     * @return
     */
    List<Map<String, String>> queryMusicGroupNameMap(@Param("musicGroupIds") Set<String> musicGroupIds);

    /**
     * 查询用户的学校
     *
     * @param userId
     * @return
     */
    School findUserSchool(@Param("userId") Integer userId);

    /**
     * 根据班级群，获取乐团信息
     *
     * @param groupId
     * @return
     */
    MusicGroup findByClassId(Integer groupId);

    /**
     * 获取用户所在乐团名
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, String>> queryUserMusicNames(@Param("userIds") Set<Integer> userIds);

    /**
     * 获取用户再乐团的状态
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, String>> queryUserMusicStatus(@Param("userIds") Set<Integer> userIds);

    List<MusicGroupRegisterDto> getMusicGroupRegister(@Param("musicGroupStatusList") List<MusicGroupStatusEnum> musicGroupStatusList, @Param("organIds") String organIds);

    List<RegisterSubjectDto> getRegisterSubjectNum(@Param("musicGroupIds") List<String> musicGroupIds,
                                                   @Param("studentMusicGroupStatus") StudentMusicGroupStatusEnum studentMusicGroupStatus,
                                                   @Param("payStatus") Integer payStatus);

    List<MusicGroupRegisterDto> getMusicGroupRegisterOrder(@Param("musicGroupIds") List<String> musicGroupIds);

    List<MusicGroupRegisterDto> getMusicGroupRegisterTotalMoney(@Param("musicGroupIds") List<String> musicGroupIds);

    /**
     * 获取老师的乐团列表
     *
     * @param teacherId
     * @return
     */
    List<MusicGroup> getTeacherMusicGroup(@Param("teacherId") Integer teacherId);

    /**
     * @describe 获取学员所在乐团名称
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/7
     * @time 14:16
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCardDto>
     */
    List<MusicCardDto> queryUserMusicInfos(Integer userId);

    /**
     * @describe 获取分部下乐团名称列表
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/7
     * @time 14:31
     * @param organId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCardDto>
     */
    List<MusicCardDto> queryOrganMusicInfos(@Param("organId") Integer organId);

    /**
     * @describe 获取学员第一个教务老师
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/24
     * @time 10:27
     * @param userId:
     * @return java.lang.Integer
     */
    Integer getFirstEduTeacherId(@Param("userId") Integer userId);

    /**
     * @describe 获取学员关联的乐团
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/28
     * @time 13:47
     * @param studentId:
     * @return com.ym.mec.biz.dal.entity.MusicGroup
     */
    MusicGroup getStuMusic(Integer studentId);

    /**
     * @describe 获取学员和乐团关联的乐团
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/28
     * @time 13:54
     * @param studentId:
     * @param educationalTeacherId:
     * @return com.ym.mec.biz.dal.entity.MusicGroup
     */
    MusicGroup getStuEduMusic(@Param("studentId") Integer studentId, @Param("educationalTeacherId") Integer educationalTeacherId);

    /**
     * 根据班级编号获取乐团信息
     * @author zouxuan
     * @param classGroupId
     * @return
     */
    MusicGroup findByClassGroupId(Integer classGroupId);
}
