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

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.CourseSchedule;
import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
import com.ym.mec.biz.dal.entity.CourseScheduleStudentPaymentDto;
import com.ym.mec.biz.dal.enums.GroupType;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Param;

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

public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseScheduleStudentPayment> {

    /**
     * @return int
     * @Author: Joburgess
     * @Date: 2019/10/10
     * @params [courseScheduleStudentPayments]
     * @describe 批量插入
     */
    int batchInsert(List<CourseScheduleStudentPayment> courseScheduleStudentPayments);

    /**
     * @describe 批量更新
     * @author Joburgess
     * @date 2020/1/10
     * @param courseScheduleStudentPayments:
     * @return int
     */
    int batchUpdate(@Param("courseScheduleStudentPayments") List<CourseScheduleStudentPayment> courseScheduleStudentPayments);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment>
     * @Author: Joburgess
     * @Date: 2019/10/15
     * @params [ids]
     * @describe 根据课程编号批量获取学生缴费信息
     */
    List<CourseScheduleStudentPayment> findByCourseScheduleIds(@Param("ids") List<Long> ids);

    /**
     * 删除学生对应的课程
     *
     * @param userId
     * @param courseScheduleList
     * @return
     */
    int deleteStudentCourseSchedule(@Param("userId") Integer userId, @Param("courseScheduleIdList") List<Long> courseScheduleIdList);

    /**
     * @param courseScheduleIds: 课程编号列表
     * @return int
     * @describe 批量删除课程对应的学生缴费记录
     * @author Joburgess
     * @date 2019/10/31
     */
    int deleteByCourseSchedule(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @param params: 班级编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResp>
     * @describe 获取指定班级中的学生
     * @author Joburgess
     * @date 2019/10/28
     */
    List<StudentAttendanceStatisticsResponse> findStudentByClassGroup(Map<String, Object> params);

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

    /**
     * @param classGroupId: 班级编号
     * @param userId:       学生编号
     * @return java.math.BigDecimal
     * @describe 统计学生剩余课时的费用
     * @author Joburgess
     * @date 2019/11/15
     */
    BigDecimal countSurplusCourseFee(@Param("classGroupId") Integer classGroupId,
                                     @Param("userId") Integer userId);

    /**
     * @param classGroupId: 班级编号
     * @return java.math.BigDecimal
     * @describe 统计所有课时的购买费用
     * @author Joburgess
     * @date 2019/11/27
     */
    BigDecimal countAllCourseFee(@Param("classGroupId") Integer classGroupId);

    /**
     * @param ids: 学生课程缴费信息编号
     * @return int
     * @describe 删除用户在指定班级上的课程
     * @author Joburgess
     * @date 2019/12/3
     */
    int batchDeleteWithID(@Param("ids") List<Integer> ids);


//    int batchDeleteWithCourseAndUser(@Param("courseScheduleIds") List<Integer> courseScheduleIds,
//                                     @Param("userId") Integer userId);

    /**
     * @param classGroupId:
     * @param userId:
     * @return java.util.List<java.lang.Integer>
     * @describe 获取用户在指定班级上缴费记录编号
     * @author Joburgess
     * @date 2019/12/3
     */
    List<Integer> findNotStartCourseStudentPaymentIdsWithClassGroupAndStudent(@Param("classGroupId") Integer classGroupId,
                                                                              @Param("userId") Integer userId);

    /**
     * @describe 统计团体下为开始课程学生数量
     * @author Joburgess
     * @date 2020.09.27
     * @param groupId:
     * @param groupType:
     * @return int
     * @describe 统计团体下为开始课程学生数量
     * @author Joburgess
     * @date 2020.09.27
     */
    int countNotStartCourseStudentNumWithGroup(@Param("groupId") String groupId,
                                               @Param("groupType") GroupType groupType);

    /**
     * @param vipGroupId: 小课编号
     * @param teachMode:  教学形式
     * @return java.math.BigDecimal
     * @describe 获取小课指定形式下最后一节课的课程单价
     * @author Joburgess
     * @date 2019/12/5
     */
    BigDecimal findVipGroupCoursePrice(@Param("vipGroupId") Integer vipGroupId,
                                       @Param("teachMode") String teachMode);

    int deleteStudentCourseScheduleByUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userIdList") List<Integer> userIdList);

    /**
     * 根据乐团编号删除记录
     * @param musicGroupId
     * @return
     */
    int deleteByMusicGroupId(@Param("musicGroupId") String musicGroupId, @Param("groupType") GroupType groupType);

    /**
     * 根据乐团编号，和groupTYpe获取学员剩余课程数
     * @param musicGroupIds
     * @param userId
     * @param groupType
     * @return
     */
    List<Map<String, Integer>> findStudentCourseNum(@Param("musicGroupIds") Set<String> musicGroupIds, @Param("userId") Integer userId, @Param("groupType") String groupType);

    /**
     * @param groupType:
     * @param groupId:
     * @return int
     * @describe 统计指定乐团下学员课程数量
     * @author Joburgess
     * @date 2019/12/23
     */
    int countStudentCourseNumWithGroup(@Param("groupType") GroupType groupType,
                                       @Param("groupId") String groupId);

    /**
     * 根据乐团，vip状态获取编号
     * @return
     */
    Set<Integer> queryMusicStudentPer();
    /**
     * 根据乐团，vip状态获取编号
     * @return
     */
    Set<Integer> queryVipStudentPer();

    /**
     * @describe
     * @author Joburgess
     * @date 2020/1/8
     * @param courseIds: 统计课程上的学生人数
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
     */
    List<Map<Integer, Integer>> countCourseStudentNum(@Param("courseIds") List<Long> courseIds);

    /**
     * @param courseScheduleId:
     * @param userId:
     * @return int
     * @describe 检测学生是否存在指定课程的缴费记录
     * @author Joburgess
     * @date 2020/1/10
     */
    int checkStudentHaveCourse(@Param("courseScheduleId") Long courseScheduleId,
                               @Param("userId") Integer userId);

    /**
     * @param courseScheduleId: 课程编号
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment>
     * @describe 查询指定课程的学生缴费记录
     * @author Joburgess
     * @date 2020/1/10
     */
    List<CourseScheduleStudentPayment> findByCourseSchedule(@Param("courseScheduleId") Long courseScheduleId);

    /**
     * @param groupId:
     * @return java.util.List<com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto>
     * @describe 获取小课需要调整的缴费记录
     * @author Joburgess
     * @date 2020/1/10
     */
    List<VipGroupGiveCourseSortDto> findVipGroupSortCourseByGroup(@Param("groupId") String groupId);

    /**
     * 获取课程学员数量
     * @param courseScheduleId
     * @return
     */
    Integer countStudentNum(Integer courseScheduleId);

    /**
     * @param groupId:
     * @param groupType:
     * @return int
     * @describe 根据团体删除班级
     * @author Joburgess
     * @date 2020/2/17
     */
    int deleteByGroup(@Param("groupId") String groupId,
                      @Param("groupType") GroupType groupType);

    /**
     * 获取当前课程的学员列表
     * @param courseScheduleId
     * @return
     */
    List<BasicUserDto> findStudents(Long courseScheduleId);

    /**
     * 获取课程的学员编号列表
     * @param courseScheduleIds
     * @return
     */
    List<Map<Integer, String>> getStudentIdMap(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @describe 获取在指定时间之后不存在网管课的学员编号列表
     * @author Joburgess
     * @date 2020/4/10
     * @param monday:
     * @return java.util.List<java.lang.Integer>
     */
    List<Practice4ExercisesSituationDto> findNoPracticeStudentIdsOnWeek(@Param("monday") String monday,
                                                                        @Param("sunday") String sunday);

    Integer findNoPracticeStudentTeacherId(@Param("studentId") Integer studentId);

    /**
     * 从指定时间开始查询学的线上可数
     * @return
     */
    List<StudentCourseTimesDto> queryStudentNotStartCourseTimesOfOnline();

    List<StudentTeacherCourseDto> findAllStudentCourseInfo();

    /**
     * @param courseScheduleIds:
     * @return java.util.List<java.util.Map < java.lang.Long, java.math.BigDecimal>>
     * @describe 统计每节课的收款
     * @author Joburgess
     * @date 2020.05.09
     */
    List<Map<Long, BigDecimal>> findCoursePayment(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * 获取学员指定课程类型的剩余课时数
     * @param studentId
     * @param courseScheduleType
     * @return
     */
    int countStudentNotStartCourseNumWithCourseType(@Param("studentId") Integer studentId,
                                                    @Param("courseScheduleType") CourseSchedule.CourseScheduleType courseScheduleType);

    /**
     * 批量操作节拍器状态
     * @param courseScheduleId
     * @param userId
     */
    void adjustPlayMidi(@Param("courseScheduleId") long courseScheduleId, @Param("userId") String userId, @Param("content") String content);

    /**
     * 获取用户的节拍器信息
     * @param userIds
     * @param courseScheduleId
     * @return
     */
    List<Map<Integer, String>> queryMidiByUserIdsAndCourseId(@Param("userIds") Set<String> userIds, @Param("courseScheduleId") String courseScheduleId);

    /**
     * 获取用户的曲目下载信息
     * @param userIds
     * @param courseScheduleId
     * @return
     */
    List<Map<Integer, String>> queryExamSongByUserIdsAndCourseId(@Param("userIds") Set<String> userIds, @Param("courseScheduleId") String courseScheduleId);

    /**
     * 获取单个用户的midi
     * @param courseScheduleId
     * @param userId
     * @return
     */
    String getMidiByCourseIdAndUserId(@Param("courseScheduleId") String courseScheduleId, @Param("userId") String userId);

    /**
     * 获取单个用户的examDownloadJson
     * @param courseScheduleId
     * @param userId
     * @return
     */
    String getExamJsonByCourseIdAndUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Integer userId);

    /**
     * @describe 统计课程组下的课程单价
     * @author Joburgess
     * @date 2020.06.11
     * @param groupType:
     * @param groupIds:
     * @return java.util.List<java.util.Map<java.lang.String,java.math.BigDecimal>>
     */
    List<Map<String, BigDecimal>> findGroupCoursesUnitPrice(@Param("groupType") GroupType groupType,
                                                            @Param("groupIds") List<String> groupIds);

    /**
     * 获取未进入教室的学员列表
     * @param roomId
     * @param courseScheduleId
     * @return
     */
    List<RongyunBasicUserDto> queryNoJoinStu(@Param("roomId") String roomId, @Param("courseScheduleId") String courseScheduleId);

    /**
     * @param batchNo:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment>
     * @describe 根据批次号获取学员课程缴费记录
     * @author Joburgess
     * @date 2020.10.30
     */
    List<CourseScheduleStudentPayment> findByBatchNo(@Param("batchNo") String batchNo);


    /**
     * 获取学生班级未开始的课程
     */
    List<CourseScheduleStudentPayment> getClassGroupNoStartCourse(@Param("classGroupIds") List<Integer> classGroupIds);


    /**
     * @describe 获取指定学员的最后一节课时间
     * @author Joburgess
     * @date 2020/11/17 0017
     * @param StudentIds:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.util.Date>>
     */
    List<Map<Integer, Date>> findStudentLastCourseSchedule(@Param("studentIds") List<Integer> StudentIds);

    List<CourseScheduleStudentPayment> queryAll(Map<String, Object> params);

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

    /**
     * 修改学员曲目下载信息
     * @author zouxuan
     * @param roomId
     */
    int adjustExamSong(@Param("roomId") Long roomId, @Param("userId") Integer userId, @Param("examSongJson") String examSongJson);

    /**
     * @describe 统计学员通过双十一活动排课的数量
     * @author qnc99
     * @date 2020/11/25 0025
     * @param userIds:
     * @param activityIds:
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentVipDouble11Dto>
     */
    List<StudentVipDouble11Dto> countStudentDouble11CourseTime(@Param("userIds") List<Integer> userIds,
                                                               @Param("specialActivityIds") List<Integer> specialActivityIds);

    /**
     * @describe 获取需要更新课营收的课程
     * @author qnc99
     * @date 2020/12/2 0002
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseScheduleStudentPaymentDto>
     */
    List<CourseScheduleStudentPaymentDto> findNeedUpdateActualPriceStudentCourses(@Param("groupIds") List<String> groupIds,
                                                                                  @Param("userIds") List<Integer> userIds,
                                                                                  @Param("groupType") GroupType groupType);

    /**
     * 根据课程编号和，学员编号获取列表信息
     * @author zouxuan
     * @param courseIds
     * @param studentId
     * @return
     */
    List<CourseScheduleStudentPayment> queryCourseByIdsAndStudentId(@Param("courseIds") List<Long> courseIds, @Param("studentId") Integer studentId, @Param("courseType") String courseType);

    /**
     * 获取班级学员关联的编号
     * @zouxuan
     * @param classGroupIds
     * @param studentIds
     * @return
     */
    List<Long> queryStudentNotStartByClassIdsAndStudentIds(@Param("classGroupIds") List<Integer> classGroupIds, @Param("studentIds") List<Integer> studentIds);

    /**
     * 获取指定列表中学员的费用列表
     * @author zouxuan
     * @param studentPaymentIds
     * @param studentId
     * @return
     */
    List<CourseScheduleStudentPayment> queryByIdsAndStudentId(@Param("studentPaymentIds") List<Long> studentPaymentIds, @Param("studentId") Integer studentId, @Param("courseType") String courseType);

    /**
     * @describe 统计课程组已经开始的课程的应缴费用
     * @author qnc99
     * @date 2020/12/8 0008
     * @param groupId:
     * @param groupType:
     * @return java.math.BigDecimal
     */
    BigDecimal countFinishCoursePriceWithMusicGroup(@Param("groupId") String groupId,
                                                    @Param("groupType") GroupType groupType,
                                                    @Param("userId") Integer userId);

    /**
     * @describe 获取学生指定日期之前指定类型的最后一节课
     * @author Joburgess
     * @date 2020/12/25 0025
     * @param studentId:
     * @param monday:
     * @return com.ym.mec.biz.dal.entity.CourseSchedule
     */
    CourseSchedule getStudentHistoryLastCourse(@Param("studentId") Integer studentId,
                                               @Param("monday") String monday,
                                               @Param("groupId") String groupId,
                                               @Param("courseType")CourseSchedule.CourseScheduleType courseType);
}
