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

import com.ym.mec.biz.dal.dto.*;
import com.ym.mec.biz.dal.entity.StudentAttendance;
import com.ym.mec.biz.dal.enums.GroupType;
import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

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

public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {

    /**
     * @Author: Joburgess
     * @Date: 2019/9/11
     * 批量插入学生上课签到情况
     */
    int addStudentAttendances(List<StudentAttendance> studentAttendances);
    
    int batchUpdate(List<StudentAttendance> studentAttendances);

    /**
     * @describe
     * @author Joburgess
     * @date 2020/1/19
     * @param courseId:
     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
     */
    List<StudentAttendance> findByCourseId(@Param("courseId") Long courseId);

    /**
     * @describe 获取课程的学生签到记录
     * @author Joburgess
     * @date 2020/2/20
     * @param courseIds:
     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
     */
    List<StudentAttendance> findByCourseIds(@Param("courseIds") List<Long> courseIds);

    /**
     * @describe 根据课程删除对应的点名记录
     * @author Joburgess
     * @date 2019/10/21
     * @param courseScheduleId:
     * @return int
     */
    @Delete("delete from student_attendance where course_schedule_id_=#{courseScheduleId}")
    int deleteStudentAttendancesByCourse(Long courseScheduleId);

    /**
     * @describe 根据课程删除考情记录
     * @author Joburgess
     * @date 2020/1/11
     * @param courseScheduleIds:
     * @return int
     */
    int deleteByCourseSchedules(@Param("courseScheduleIds") List<Long> courseScheduleIds);

    /**
     * @describe 删除学生签到记录
     * @author Joburgess
     * @date 2020/1/17
     * @param courseScheduleIds:
     * @param userID:
     * @return int
     */
    int deleteByCourseAndUser(@Param("courseScheduleIds") List<Long> courseScheduleIds,
                              @Param("userId") Integer userID);

    /**
     * @describe 根据课程和学生删除考情记录
     * @author Joburgess
     * @date 2020/1/17
     * @param courseScheduleId:
     * @param userIds:
     * @return int
     */
    int deleteStudentAttendancesByCourseAndUsers(@Param("courseScheduleId") Long courseScheduleId,
                                                 @Param("userIds") List<Integer> userIds);

    /**
     * 统计学生各种状态人数
     * @param classId
     * @return
     */
    List<StudentStatusCountUtilEntity> countStudentStatus(@Param("classId") Long classId);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/12
     * 获取学生签到所需信息
     */
    StudentAttendance getStudentAttendanceInfo(StudentAttendance studentAttendance);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/29
     * 获取对应学生最后一次的签到记录
     */
    StudentAttendance getStudentLatestAttendanceInfo(StudentAttendance studentAttendance);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/16
     * 获取学生个人上课签到记录
     */
    List<StudentPersonalAttendanceDto> queryStudentPersonalAttendances(Map<String,Object> params);

    /**
     * @Author: Joburgess
     * @Date: 2019/9/16
     * 获取学生个人上课签到记录统计
     */
    int queryStudentPersonalAttendancesCount(Map<String,Object> params);


    /**
     * @Author: Joburgess
     * @Date: 2019/9/18
     * 统计正常签到的学生数量
     */
    @Select("SELECT COUNT(*) FROM student_attendance WHERE class_group_id_=#{classGroupID} AND status_=\"NORMAL\"")
    int countNormalAttendanceStudentNums(Long classGroupID);

    /**
     * @Author: Joburgess
     * @Date: 2019/10/16
     * @params [courseScheduleId]
     * @return com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto
     * @describe 根据课程统计点名记录
     */
    @Select("SELECT COUNT(*) FROM student_attendance WHERE course_schedule_id_=#{courseScheduleId} AND remark_ IS NULL")
    int countByCourseSchedule(Long courseScheduleId);

    /**
     * @describe 统计每节课上的学生数，排除学员自己请假的记录
     * @author Joburgess
     * @date 2019/12/26
     * @param courseScheduleIds:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
     */
    List<Map<Integer,Integer>> countStudentAttendancesByCourses(@Param("courseScheduleIds") List courseScheduleIds);

    /**
     * @describe 统计课程里对应状态的学生数量
     * @author Joburgess
     * @date 2020/4/18
     * @param courseScheduleIds:
     * @param status:
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
     */
    List<Map<Integer, Integer>> countStudentAttendancesByCoursesAndStatus(@Param("courseScheduleIds") List courseScheduleIds,
                                                                          @Param("status") StudentAttendanceStatusEnum status);

    /**
     * @describe 根据课程获取最后的点名时间
     * @author Joburgess
     * @date 2019/10/24
     * @param courseScheduleId: 课程编号
     * @return java.util.Date
     */
    Date findLatestAttendanceDate(Long courseScheduleId);

    /**
     * @describe 根据班级和学生编号查询签到记录
     * @author Joburgess
     * @date 2019/10/28
     * @param classGroupId: 班级编号
     * @param userIds: 学生编号列表
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceResponse>
     */
    List<StudentAttendanceResponse> findByClassGroupAndUsers(@Param("classGroupId") Long classGroupId,
                                                             @Param("userIds") List<Integer> userIds);

    /**
     * @describe 统计指定班级中学生不同签到状态的次数
     * @author Joburgess
     * @date 2019/10/28
     * @param classGroupId: 班级编号
     * @param userIds: 用户编号
     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto>
     */
    List<StudentAttendanceStatusCountDto> countStudentAttendanceStatus(@Param("classGroupId") Long classGroupId,
                                                                       @Param("userIds") List<Integer> userIds);

    /**
     * @describe 获取课程的当前课次
     * @author Joburgess
     * @date 2019/10/28
     * @param courseScheduleIds: 课程编号列表
     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
     */
    List<Map<Integer,Integer>> getCurrentClassTimesByCourses(@Param("courseScheduleIds") List<Integer> courseScheduleIds);

    /**
     * @describe 获取班级做后点名的时间
     * @author Joburgess
     * @date 2019/10/28
     * @param classGroupId: 班级编号
     * @return java.util.Date
     */
    Date findLatestSignInDate(Integer classGroupId);

    /**
     * 根据签到状态和课程编号查询签到记录
     * @param userId
     * @param courseScheduleId
     * @return
     */
    StudentAttendance findByStatusAndCourseScheduleId(@Param("userId") Integer userId, @Param("courseScheduleId") int courseScheduleId);


    /**
     * 封装未签到学员列表
     * @param courseScheduleId
     * @return
     */
    List<StudentAttendance> queryNoSignStudentRecord(Integer courseScheduleId);

    /**
     * @describe 根据课程编号统计学生正常签到的记录数
     * @author Joburgess
     * @date 2019/12/11
     * @param courseScheduleId: 课程编号
     * @return int
     */
    int countStudentAttendenceNum(@Param("courseScheduleId") Integer courseScheduleId);

    /**
     * @describe 统计课程中4小时前的请假人数
     * @author Joburgess
     * @date 2020/1/11
     * @param courseScheduleIds: 课程计划编号列表
     * @param hours: 小时
     * @return java.util.List<java.util.Map<java.lang.Long,java.lang.Integer>>
     */
    List<Map<Long,Integer>> countCourseLeaveStudentNumWithFourHoursAgo(@Param("courseScheduleIds") List<Long> courseScheduleIds,
                                                                       @Param("hours") Integer hours);

    /**
     * 获取某节课所有学员签到记录
     * @param params
     * @return
     */
    List<StudentAttendance> findStudentAttendance(Map<String, Object> params);

    /**
     * COUNT某节课所有学员签到记录
     * @param params
     * @return
     */
    int countStudentAttendance(Map<String, Object> params);

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

    /**
     * 清除学员签退信息
     * @param courseId
     * @param userId
     */
    void cleanCourseStudentSignOut(@Param("courseId") Long courseId, @Param("userId") Integer userId);

    /**
     * @describe 获取课程的学员签到记录（排除退学学员）
     * @author Joburgess
     * @date 2020.09.15
     * @param courseIds:
     * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
     */
    List<StudentAttendance> getWithCoursesAndExcludeQuitStudent(@Param("courseIds") List<Long> courseIds);

    /**
     * @describe 获取学员连堂课第一次签到的课程
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/27
     * @time 10:00
     * @param courseScheduleId:
     * @return java.lang.Long
     */
    Long findFirstSign(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Integer userId);

    /**
     * 学员考勤记录导出查询
     * @param params
     * @return
     */
    int countExportStudentAttendancesQueryPage(Map<String, Object> params);

    /**
     * 学员考勤记录导出查询
     * @param params
     * @return
     */
    List<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(Map<String, Object> params);
}
