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

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.ClassGroup;
import com.ym.mec.biz.dal.entity.CourseSchedule;
import com.ym.mec.biz.dal.entity.CourseScheduleEvaluate;
import com.ym.mec.biz.dal.entity.PracticeGroup;
import com.ym.mec.biz.dal.enums.GroupStatusEnum;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface PracticeGroupDao extends com.ym.mec.common.dal.BaseDAO<Long, PracticeGroup> {

    /**
     * @param userId:    用户编号
     * @param startDate: 开始时间
     * @param endDate:   结束时间
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取学生指定日期内预约的陪练课
     * @author Joburgess
     * @date 2020/1/31
     */
    List<PracticeGroup> getUserPracticeCoursesWithDateRange(@Param("userId") Integer userId,
                                                            @Param("startDate") Date startDate,
                                                            @Param("endDate") Date endDate);

    /**
     * @param userId:
     * @return com.ym.mec.biz.dal.entity.PracticeGroup
     * @describe 获取学生的免费陪练课
     * @author Joburgess
     * @date 2020/2/24
     */
    PracticeGroup getUserFreePracticeGroup(@Param("userId") Integer userId);

    /**
     * @param groups:
     * @return int
     * @describe 批量更新
     * @author Joburgess
     * @date 2020/2/23
     */
    int batchUpdate(@Param("groups") List<PracticeGroup> groups);

    /**
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 统计用户的申请记录
     * @author Joburgess
     * @date 2020/2/3
     */
    int countUserPracticeApplyRecord(@Param("userId") Integer userId);

    /**
     * count陪练课列表数量
     *
     * @param params
     * @return
     */
    int countPracticeGroupByOrgan(Map<String, Object> params);

    /**
     * 获取陪练课列表
     *
     * @param params
     * @return
     */
    List<PracticeGroupDto> findAllByOrgan(Map<String, Object> params);

    /**
     * 获取已上课程数量
     *
     * @param practiceGroupIds
     * @return
     */
    List<Map<Long, Integer>> countPracticeGroupOverCourse(List<String> practiceGroupIds);

    /**
     * 修改老师
     *
     * @param practiceGroupId
     * @param teacherId
     */
    void updateUserId(@Param("practiceGroupId") String practiceGroupId, @Param("teacherId") Integer teacherId);


    /**
     * @param userId:
     * @param groupId:
     * @return com.ym.mec.biz.dal.entity.PracticeGroup
     * @describe 获取学生指定的课程组
     * @author Joburgess
     * @date 2020/2/19
     */
    PracticeGroup findUserPracticeGroup(@Param("userId") Integer userId,
                                        @Param("groupId") Long groupId);

    /**
     * @param studentId:
     * @return int
     * @describe 统计指定学员购买收费网管课的数量
     * @author Joburgess
     * @date 2020/4/24
     */
    int checkStudentExitChargePractice(@Param("studentId") Integer studentId);

    /**
     * @param userId:
     * @param groupId:
     * @return com.ym.mec.biz.dal.entity.PracticeGroup
     * @describe 获取学生指定的课程组
     * @author Joburgess
     * @date 2020/2/19
     */
    PracticeGroupDto findUserPracticeGroup2(@Param("userId") Integer userId,
                                            @Param("groupId") Long groupId);

    /**
     * @param userId: 学生编号
     * @return com.ym.mec.biz.dal.entity.PracticeGroup
     * @describe 获取学生最后一次购买的陪练课组
     * @author Joburgess
     * @date 2020/2/17
     */
    PracticeGroup findUserLatestPracticeGroup(@Param("userId") Integer userId);

    /**
     * @param userId: 用户编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.PracticeCourseDto>
     * @describe 获取用户购买的陪练课
     * @author Joburgess
     * @date 2020/2/18
     */
    List<PracticeCourseDto> findUserBuyPracticeGroups(@Param("userId") Integer userId);


    List<PracticeCourseDto> findUserBuyPracticeGroupsWithDate(@Param("userId") Integer userId,
                                                              @Param("date") Date date);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取已经达到截至时间的陪练课程组
     * @author Joburgess
     * @date 2020/2/23
     */
    List<PracticeGroup> findHistoryPracticeGroups();

    /**
     * @param groupId:
     * @return com.ym.mec.biz.dal.entity.PracticeGroup
     * @describe
     * @author Joburgess
     * @date 2020/2/24
     */
    PracticeGroup lockPracticeGroup(@Param("groupId") Integer groupId);

    /**
     * @param userId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取用户指定状态的陪练课程组
     * @author Joburgess
     * @date 2020/2/26
     */
    List<PracticeGroup> findUserStatusPracticeGroups(@Param("userId") Integer userId,
                                                     @Param("groupStatus") GroupStatusEnum groupStatusEnum);

    /**
     * @param userId:
     * @param date:
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取用户指定日期的未成功订单
     * @author Joburgess
     * @date 2020/3/2
     */
    List<PracticeGroup> findUserLockPracticeGroupWithDate(@Param("userId") Integer userId,
                                                          @Param("date") Date date);

    /**
     * @param userId:
     * @param date:
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取用户指定日期及之前的未成功订单
     * @author Joburgess
     * @date 2020/3/2
     */
    List<PracticeGroup> findUserLockPracticeGroupWithDateBefore(@Param("userId") Integer userId,
                                                                @Param("date") Date date);

    List<PracticeGroupDto> findPracticeGroupsReviews(Map<String, Object> params);

    Integer countPracticeGroupReviews(Map<String, Object> params);

    /**
     * 獲取要预生成报告的数据
     *
     * @param nowDate
     * @param afterDate
     * @return
     */
    List<CourseScheduleEvaluate> getNeedPostReportPracticeGroups(@Param("nowDate") Date nowDate, @Param("afterDate") Date afterDate, @Param("afterDateIsLastDay") boolean afterDateIsLastDay);

    /**
     * 获取报告的课次数
     *
     * @param classGroupIds
     * @param startDate
     * @param endDate
     * @return
     */
    List<ClassGroup> getReportCourseTimes(@Param("classGroupIds") List<Integer> classGroupIds, @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 根据课程组id查询课程组详情
     *
     * @param id
     * @return
     */
    PracticeCourseDto findByGroupId(@Param("id") Integer id);

    /**
     * COUNT网管课购买列表
     *
     * @param params
     * @return
     */
    int countStudentBuys(Map<String, Object> params);

    /**
     * query网管课购买列表
     *
     * @param params
     * @return
     */
    List<StudentBuyPracticeDto> queryStudentBuys(Map<String, Object> params);


    /**
     * 获取导出网管课信息
     *
     * @param organIds
     * @return
     */
    List<CourseGroupExportDto> getPracticeGroupExport(@Param("organIds") String organIds);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
     * @describe 获取转化失败的学员-之前有免费网管课，但是之后没有线上课的学员
     * @author Joburgess
     * @date 2020/4/23
     */
    List<SimpleUserDto> findConvertDefeatStudents(Map<String, Object> params);

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

    /**
     * @param studentOrganId: 学生分部编号
     * @param subjectId:      声部编号
     * @param studentId:      学生编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
     * @describe 获取可以指派试听课的老师列表
     * @author Joburgess
     * @date 2020/4/23
     */
    List<SimpleUserDto> findEnableAssignTeachers(@Param("studentOrganId") Integer studentOrganId,
                                                 @Param("subjectId") Integer subjectId,
                                                 @Param("studentId") Integer studentId);


    /**
     * 修改网管课备注
     *
     * @param groupId
     * @param memo
     */
    void updateMemo(@Param("groupId") Long groupId, @Param("memo") String memo);

    /**
     * @param studentId:
     * @return java.lang.Integer
     * @describe 获取学生最后一节网管课对应的声部
     * @author Joburgess
     * @date 2020/4/23
     */
    Integer findLastPracticeSubject(@Param("studentId") Integer studentId);

    /**
     * @param studentId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取学生的网管试听课
     * @author Joburgess
     * @date 2020/4/24
     */
    List<PracticeGroup> findStudentTrialPractices(@Param("studentId") Integer studentId);

    int countStudentTrialPractices(@Param("studentId") Integer studentId);

    /**
     * @param studentId:
     * @return int
     * @describe 统计学生进行中的试听课数量
     * @author Joburgess
     * @date 2020.04.28
     */
    int countStudentIngTrialPractices(@Param("studentId") Integer studentId);

    /**
     * @param studentId:
     * @param teacherId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
     * @describe 获取老师
     * @author Joburgess
     * @date 2020/4/24
     */
    List<CourseSchedule> findStudentAndTeacherTrialPractices(@Param("studentId") Integer studentId,
                                                             @Param("teacherId") Integer teacherId);

    /**
     * @param studentId:
     * @param teacherId:
     * @return int
     * @describe 统计指定老师和学生是否存在关联的试听课
     * @author Joburgess
     * @date 2020/4/24
     */
    int countStudentAndTeacherTrialPractices(@Param("studentId") Integer studentId,
                                             @Param("teacherId") Integer teacherId);

    /**
     * @return java.util.List<com.ym.mec.biz.dal.entity.PracticeGroup>
     * @describe 获取需要提醒续费网管课的用户列表
     * @author Joburgess
     * @date 2020.05.29
     */
    List<Integer> getNeedRemindPracticeUsers();

    /**
     * @param studentIds:
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.String>>
     * @describe 获取用户和需要提醒的网管课map
     * @author Joburgess
     * @date 2020.05.29
     */
    List<Map<Integer, String>> getUserNeedRemindPracticeIdMap(@Param("studentIds") List<Integer> studentIds);

    /**
     * @param practiceIds:
     * @param remindStatus:
     * @return int
     * @describe 批量修改网管课续费提醒状态
     * @author Joburgess
     * @date 2020.05.29
     */
    int batchUpdatePracticeRemindStatus(@Param("practiceIds") List<Integer> practiceIds,
                                        @Param("remindStatus") Integer remindStatus);

    List<PracticeCourseDto> getPracticeGroupByIds(@Param("practiceIds") List<Long> practiceIds);

    List<PracticeGroup> getWithIds(@Param("practiceIds") List<Long> practiceIds);

    /**
     * @describe 获取网管课类型
     * @author Joburgess
     * @date 2020.08.20
     * @param practiceIds:
     * @return java.util.List<java.util.Map<java.lang.Long,java.lang.String>>
     */
    List<Map<Long, String>> getPracticeGroupType(@Param("practiceIds") List<Long> practiceIds);
}
