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

import com.ym.mec.biz.dal.dto.BasicUserDto;
import com.ym.mec.biz.dal.dto.StudentAttendanceStatisticsResponse;
import com.ym.mec.biz.dal.dto.VipGroupGiveCourseSortDto;
import com.ym.mec.biz.dal.entity.CourseSchedule;
import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
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.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("courseScheduleList") List<CourseSchedule> courseScheduleList);

    /**
     * @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);

    /**
     * @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);

    /**
     * @describe 统计指定乐团下学员课程数量
     * @author Joburgess
     * @date 2019/12/23
     * @param groupType:
     * @param groupId:
     * @return int
     */
    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);

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

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

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

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

    /**
     * @describe 根据团体删除班级
     * @author Joburgess
     * @date 2020/2/17
     * @param groupId:
     * @param groupType:
     * @return int
     */
    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);
}
