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.auth.api.entity.SysUser;
import com.ym.mec.biz.dal.dto.BasicUserDto;
import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
import com.ym.mec.biz.dal.dto.StudentListCourseDto;
import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
import com.ym.mec.biz.dal.dto.StudentManageListDto;
import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
import com.ym.mec.biz.dal.dto.StudentPaymentDto;

/**
 * @Author Joburgess
 * @Date 2019/9/19
 */
public interface StudentManageDao {

    /**
     * @Author: Joburgess
     * @Date: 2019/9/19
     * 根据部门ID获取该部门下所有学生
     */
    List<StudentManageListDto> findStudentsByOrganId(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/19
     * 根据部门ID统计该部门下所有学生数
     */
    int countStudentByOrganId(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 根据学生ID获取该学院基本信息
     */
    StudentManageListDto findStudentBaseInfoByUserID(Integer userId);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 根据商品id列表获取商品名称列表
     */
    String[] findGoodsNamesByIds(@Param("ids") String[] ids);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 根据学生ID获取其所在的乐团
     */
    List<StudentManageBaseInfoOfMusicGroupDto> findStudentMusicGroupsByUserId(Integer userId);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 获取某乐团的排课列表
     */
    List<StudentManageCourseListDto> findStudentCourseList(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 统计乐团排课数
     */
    int countStudentCourses(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 学生签到列表获取
     */
    List<StudentManageCourseListDto> findStudentAttendances(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/20
     * 统计学生签到次数
     */
    int countStudentAttendances(Map<String, Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/21
     * 获取学上账户基本信息
     */
    StudentManageAccountBaseInfoDto getStudentAccountBaseInfo(Integer userId);

    /**
     * 获取学员扣费记录列表
     *
     * @param params
     * @return
     */
    List<StudentPaymentDto> queryStudentPayment(Map<String, Object> params);

    /**
     * COUNT学员扣费记录列表
     *
     * @param params
     * @return
     */
    int countStudentPayment(Map<String, Object> params);

    /**
     * 获取乐团管理学员列表
     *
     * @param params
     * @return
     */
    List<MusicGroupStudentsDto> queryMusicGroupStudent(Map<String, Object> params);

    /**
     * COUNT乐团管理学员列表
     *
     * @param params
     * @return
     */
    int countMusicGroupStudent(Map<String, Object> params);

    /**
     * 获取乐团在读人数
     *
     * @param musicGroupId
     * @return
     */
    Integer countStudyNum(String musicGroupId);

    /**
     * 获取乐团退团人数
     *
     * @param musicGroupId
     * @return
     */
    Integer countQuitNum(@Param("musicGroupId") String musicGroupId);

    /**
     * 获取乐团新增的学员人数
     *
     * @param musicGroupId
     * @return
     */
    Integer countAddNum(String musicGroupId);

    /**
     * 乐团管理--点名总览
     *
     * @param params
     * @return
     */
    List<MusicGroupStudentSignDto> queryMusicGroupStudentsSign(Map<String, Object> params);

    /**
     * COUNT乐团管理--点名总览
     *
     * @param params
     * @return
     */
    int countMusicGroupStudentsSign(Map<String, Object> params);

    /**
     * 修改用户信息
     *
     * @param sysUser
     */
    void updateUser(SysUser sysUser);

    /**
     * 获取学员的vip列表
     *
     * @param params
     * @return
     */
    List<StudentManageVipGroupClassDto> findStudentVipGroupClass(Map<String, Object> params);

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

    /**
     * 获取未激活，有课的列表
     *
     * @return
     */
    List<StudentManageListDto> queryHasCourseStudent(Map<String, Object> params);

    /**
     * 获取签到学员数
     *
     * @param courseScheduleId
     * @param status
     * @return
     */
    Integer countStudentSignInNum(@Param("courseScheduleId") Integer courseScheduleId, @Param("status") String status);

    /**
     * 获取交了作业的学生数
     *
     * @param courseScheduleId
     * @return
     */
    Integer countHomeworkNum(Integer courseScheduleId);

    /**
     * 获取已回复的数量
     *
     * @param courseScheduleId
     * @return
     */
    Integer countRepliedNum(Integer courseScheduleId);

    /**
     * 是否有课map列表
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, Integer>> getHasPracticeCourse(@Param("userIds") Set<Integer> userIds);

    /**
     * 是否激活
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, Integer>> getIsActive(@Param("userIds") Set<Integer> userIds);

    /**
     * 是否预约陪练课
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, Integer>> getIsMake(@Param("userIds") Set<Integer> userIds);

    /**
     * 获取用户所属声部
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, Integer>> querySubjectNames(@Param("userIds") Set<Integer> userIds);

    /**
     * 乐团修改--学员缴费记录--可新增学员列表
     *
     * @param musicGroupId
     * @param musicGroupPaymentCalenderId
     * @return
     */
    List<BasicUserDto> queryCanAddStudent(@Param("musicGroupId") String musicGroupId,
                                          @Param("batchNo") String batchNo,
                                          @Param("search") String search,
                                          @Param("subjectId") Integer subjectId);

    /**
     * 学员是否有课
     *
     * @param userIds
     * @return
     */
    List<Map<Integer, Integer>> queryHasCourseMap(@Param("userIds") Set<Integer> userIds);

    /**
     * 查询学生剩余课程
     *
     * @return
     */
    List<StudentListCourseDto> queryStudentRemianCourse(@Param("userIds") Set<Integer> userIds);

    /**
     * 获取教务老师关联vip的学员列表
     *
     * @return
     */
    List<BasicUserDto> queryVipGroupStudents(Map<String, Object> params);

    /**
     * 获取教务老师关联vip的学员列表
     *
     * @return
     */
    int countVipGroupStudents(Map<String, Object> params);

    /**
     * 获取教务老师关联网管课的学员列表
     *
     * @return
     */
    List<BasicUserDto> queryPracticeGroupStudents(Map<String, Object> params);

    /**
     * 获取教务老师关联网管课的学员列表
     *
     * @return
     */
    int countPracticeGroupStudents(Map<String, Object> params);
}
