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

import java.math.BigDecimal;
import java.util.*;

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.Subject;

import org.apache.ibatis.annotations.Param;

import com.ym.mec.auth.api.entity.SysUser;
import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
import com.ym.mec.biz.dal.entity.StudentRegistration;
import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
import com.ym.mec.common.dal.BaseDAO;

public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistration> {

    StudentRegistration lock(@Param("id") Long id);

    StudentRegistration lockWithUserAndMusic(@Param("userId") Integer userId,
                                             @Param("musicGroupId") String musicGroupId);

    /**
     * 获取乐团学员报名详情
     *
     * @param params
     * @return
     */
    List<StudentApplyDetailDto> queryStudentDetailPage(Map<String, Object> params);

    /**
     * 获取乐团学员报名详情条数
     *
     * @param params
     * @return
     */
    int queryStudentDetailCount(Map<String, Object> params);

    /**
     * 根据乐团编号获取缴费学员人数
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Integer, Integer>> countPayNum(@Param("musicGroupId") String musicGroupId);

    /**
     * 学生报名缴费金额详情
     *
     * @param studentId
     * @param musicGroupId
     * @return
     */
    StudentFeeDetailDto queryFeeDetail(@Param("studentId") Integer studentId, @Param("musicGroupId") String musicGroupId);

    /**
     * 获取乐团声部未分配的班级的学生
     *
     * @param musicGroupId    乐团id
     * @param actualSubjectId 科目id
     * @return
     */
    List<StudentRegistration> getNoClassStuBySubjectId(@Param("musicGroupId") String musicGroupId, @Param("actualSubjectId") String actualSubjectId);

    /**
     * 获取乐团声部未分配学生数
     *
     * @param musicGroupId
     * @return
     */
    List<MusicGroupSubjectPlan> getNoClassStuCountByMusicGroupId(@Param("musicGroupId") String musicGroupId);

    /**
     * 根据乐团id和user_id 更新
     *
     * @param studentRegistration
     * @return
     */
    Integer updateByUserIdAndMusicGroupId(@Param("studentRegistration") StudentRegistration studentRegistration);

    /**
     * 查询学生信息
     *
     * @param userId
     * @return
     */
    StudentInfo queryStudentInfo(Integer userId);

    /**
     * 查询用户指定乐团的报名信息
     *
     * @param userId       用户编号
     * @param musicGroupId 乐团编号
     * @return
     */
    StudentRegistration queryByUserIdAndMusicGroupId(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);


    /**
     * 查询手机是否已注册
     *
     * @param musicGroupId
     * @param parentsPhone
     * @return
     */
    StudentRegistration getByPhoneAndMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("parentsPhone") String parentsPhone);

    /**
     * 查询用户是否存在
     *
     * @param phone
     * @return
     */
    SysUser getSysUserByPhone(String phone);

    /**
     * 获取班级学生
     *
     * @param musicGroupId
     * @param classGroupId
     * @return
     */
    List<StudentRegistration> findClassGroupStu(@Param("musicGroupId") String musicGroupId, @Param("classGroupId") Integer classGroupId);

    /**
     * 查询乐团的学生
     *
     * @param musicGroupId
     * @param actualSubjectId
     * @return
     */
    List<StudentRegistration> findMusicGroupNoClassGroupStudent(@Param("musicGroupId") String musicGroupId, @Param("actualSubjectId") Integer actualSubjectId);

    /**
     * 批量调剂学生专业
     *
     * @param userId
     * @param subId
     * @return
     */
    int batchUpdateSubject(@Param("userId") Integer userId, @Param("subId") Integer subId, @Param("musicGroupId") String musicGroupId);

    /**
     * 根据id list 查询报名学生
     *
     * @param idList
     * @return
     */
    List<StudentRegistration> findStudentListByIdList(@Param("idList") List<Long> idList);

    /**
     * 批量插入
     *
     * @param studentRegistrationList
     * @return
     */
    int batchInsert(@Param("studentRegistrationList") List<StudentRegistration> studentRegistrationList);


    /**
     * 根据userId 和班级id查询学生
     *
     * @param userId
     * @param classGroupId
     * @return
     */
    StudentRegistration findStudentByClassGroupIdAndUserId(@Param("userId") Integer userId, @Param("classGroupId") Integer classGroupId);

    /**
     * 查询乐团声部下的学生
     *
     * @return
     */
    List<StudentRegistration> findMusicGroupStudent(@Param("musicGroupId") String musicGroupId, @Param("actualSubjectId") String actualSubjectId);

    /**
     * 查询乐团userIdList的学生
     *
     * @param musicGroupId
     * @param userIdList
     * @return
     */
    List<StudentRegistration> findStudentListByUserIdList(@Param("musicGroupId") String musicGroupId, @Param("userIdList") List<Integer> userIdList);

    /**
     * @param ids
     * @return
     */
    int batchOpenPay(@Param("ids") String ids, @Param("paymentStatus") PaymentStatusEnum paymentStatus);

    /**
     * 乐团添加学员
     *
     * @param studentRegistration
     */
    void insertBasic(StudentRegistration studentRegistration);

    /**
     * 获取乐团已缴费学员列表
     *
     * @param musicGroupId
     * @return
     */
    List<StudentRegistration> queryStudentByMusicGroupId(String musicGroupId);

    /**
     * 统计乐团不同声部报名人数
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Integer, Integer>> countApplyNum(String musicGroupId);

    /**
     * 根据家长手机号获取用户编号
     *
     * @param parentPhones
     * @return
     */
    List<Map<Integer, String>> findParentId(String parentPhones);

    /**
     * 查询学生数
     *
     * @return
     */
    Map<String, Integer> queryStudentNum(@Param("organId") String organId);

    /**
     * 根据乐团编号获取当前乐团所有已报名学员
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Integer, String>> findMapByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("paymentStatus") Integer paymentStatus);

    /**
     * 根据乐团编号获取当前乐团所有已报名学员
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Integer, String>> findIdMapByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("paymentStatus") Integer paymentStatus);

    /**
     * 乐团开启缴费
     *
     * @param musicGroupId
     * @param paymentStatus
     * @return
     */
    int musicGroupOpenPay(@Param("musicGroupId") String musicGroupId, @Param("paymentStatus") PaymentStatusEnum paymentStatus);

    /**
     * 删除班级学生
     *
     * @param classGroupId
     * @return
     */
    int deleteClassGroup(@Param("classGroupId") Integer classGroupId);

    int findMusicGroupStudentNum(@Param("musicGroupId") String musicGroupId);

    /**
     * 更新用户证件信息
     *
     * @return
     */
    int updateUser(@Param("id") Integer id,
                   @Param("realName") String realName,
                   @Param("idCardNo") String idCardNo,
                   @Param("certificateType") String certificateType);

    /**
     * 获取乐团在读人数
     *
     * @param musicGroupIds
     * @return
     */
    List<Map<String, Integer>> countNormalNum(String musicGroupIds);

    /**
     * 获取学员基本信息
     *
     * @param mobile
     * @return
     */
    StudentRegistration queryUserByPhone(String mobile);

    /**
     * 批量修改学生年级班级
     *
     * @param studentRegistration
     */
    void updateCurrentClass(StudentRegistration studentRegistration);

    /**
     * 获取乐团学员购买方式
     *
     * @param musicGroupId
     * @return
     */
    List<Map<Long, String>> queryPurchaseTypeMap(String musicGroupId);

    /**
     * 获取学员注册比例
     *
     * @return
     */
    List<StudentRegisterPerDto> queryStudentPer(@Param("userIds") Set<Integer> userIds);

    /**
     * 获取乐团报名信息和学校信息
     *
     * @param musicGroupId
     * @param userId
     * @return
     */
    StudentRegistration findStudentByMusicGroupIdAndUserId(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);

    /**
     * 获取学员所在乐团
     *
     * @param studentId
     * @return
     */
    List<String> queryStudentMusicGroup(Integer studentId);

    String getSubjectIds(Integer userId);

    /**
     * 获取乐团下所有学员身上的声部列表
     *
     * @param musicGroupId
     * @return
     */
    List<Subject> findMusicGroupAllStudentSubjects(@Param("musicGroupId") String musicGroupId);

    /**
     * 获取学员详情页，包含所在乐团信息
     *
     * @param studentId
     * @return
     */
    StudentMusicDetailDto getStudentDetail(Integer studentId);

    /**
     * 获取乐团的学生
     *
     * @param musicGroupId
     * @return
     */
    List<StudentRegistration> getMusicGroupStu(@Param("musicGroupId") String musicGroupId);

    /**
     * 获取老师对应乐团的学生
     *
     * @param musicGroupId
     * @param teacherId
     * @return
     */
    List<StudentRegistration> getMusicGroupStu4Teacher(@Param("musicGroupId") String musicGroupId, @Param("teacherId") Integer teacherId);

    StudentRegistration getStudentRegister(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);

    /**
     * 获取分部乐团在读学生数
     *
     * @return
     */
    List<OrderStatisDto> getOrganNormalStudent();

    /**
     * @param userIds:
     * @return java.util.List<com.ym.mec.biz.dal.dto.UserGroupDto>
     * @describe 获取学员关联乐团记录
     * @author qnc99
     * @date 2020/11/24 0024
     */
    List<UserGroupDto> getUserGroups(@Param("userIds") List<Integer> userIds);


    /**
     * 获取乐团未交费的学生
     *
     * @param musicGroupId
     * @return
     */
    List<StudentRegistration> getNoPaymentStudent(@Param("musicGroupId") String musicGroupId);

    /**
     * 获取乐团声部学生数量
     *
     * @return
     */
    Integer getMusicGroupSubjectStudentNum(@Param("musicGroupId") String musicGroupId, @Param("subjectIds") String subjectIds);

    /**
     * 查询用户所在乐团信息
     *
     * @param userId
     * @return
     */
    List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId);

    /**
     * 获取学员剩余课程费用
     *
     * @param classGroupId
     * @param studentIds
     * @return
     */
    List<Map<Integer, BigDecimal>> querySurplusCourseFeeByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("studentIds") String studentIds);

    /**
     * 根据学员编号列表和乐团编号获取学员注册列表
     *
     * @param studentIds
     * @param musicGroupId
     * @return
     */
    List<StudentRegistration> queryByUserIdsAndMusicGroupId(@Param("studentIds") String studentIds, @Param("musicGroupId") String musicGroupId);

    /**
     * 批量删除注册信息
     * @param ids
     * @return
     */
    int batchDelete(@Param("ids") List<Long> ids);

    /**
     * 获取学员声部名称
     * @param musicGroupId
     * @param studentId
     * @return
     */
    String getStudentSubjectName(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);

    /**
     * 获取学员声部名称
     * @param musicGroupId
     * @param studentIds
     * @return
     */
    List<Map<Integer,String>> getStudentSubjectNameByStuIds(@Param("musicGroupId") String musicGroupId, @Param("studentIds") Collection<Integer> studentIds);
}
