package cn.iocoder.yudao.module.course.mapper;

import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.base.vo.DlDriveSchoolCoachPageReqVO;
import cn.iocoder.yudao.module.base.vo.DlDriveSchoolCoachRespVO;
import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.course.vo.*;
import cn.iocoder.yudao.module.exam.entity.ExamBatch;
import cn.iocoder.yudao.module.exam.vo.ExamBatchNewVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 驾校-学员课程进度 Mapper
 *
 * @author 若依
 */
@Mapper
public interface ProcessMapper extends BaseMapper<Process> {

    /**
     * 更新学生考试的状态为已送考状态
     * @author vinjor-M
     * @date 23:59 2025/1/20
     * @param userIdList 学生Id集和
 * @param courseId 课程ID
 * @param subject 科目
 * @param coachId 教练
     * @return int
    **/
    int updateProcessBatch(@Param("userIdList")List<Long> userIdList,
                           @Param("courseId")String courseId,
                           @Param("subject")Integer subject,
                           @Param("coachId")Long coachId);

    /**
     * 更新考试结果及学习进度
     * @author vinjor-M
     * @date 13:55 2025/1/21
     * @return int
    **/
    int updateProcessExamResult(@Param("courseId")String courseId,
                                @Param("subject")Integer subject,
                                @Param("coachId")Long coachId,
                                @Param("userId")Long userId,
                                @Param("status")String status,
                                @Param("examStatus")String examStatus,
                                @Param("examScore")Double examScore,
                                @Param("images")String images,
                                @Param("examTime")String examTime);

    /**
     * 查用户最新的一条且科目最大的一条学习记录
     * @author vinjor-M
     * @date 15:58 2025/2/8
     * @param userId 用户id
     * @return cn.iocoder.yudao.module.course.entity.Process
    **/
    Process selectNewMaxByUserId(@Param("userId") Long userId,@Param("coachId") Long coachId);

    /**
     * 分页查询学员课程进度
     * @author PQZ
     * @date 15:50 2025/2/17
     * @param entity {@link ProcessVO}
     * @param page 分页参数
     * @return com.baomidou.mybatisplus.core.metadata.IPage<cn.iocoder.yudao.module.course.vo.ProcessVO>
    **/
    IPage<ProcessVO> pageProcess(@Param("entity") ProcessVO entity, Page<ProcessVO> page);
    IPage<ProcessVO> pageProcessNew(@Param("entity") ProcessVO entity, Page<ProcessVO> page);

    Double selectAllTrainTime(@Param("userId") Long userId,@Param("courseId") String courseId);

    /**
     * 获取学员课程进度列表
     */
    List<Process> getProcessList(@Param("userId") Long userId, @Param("courseId") String courseId);

    /**
     * 获取学员考试批次信息
     */
    ProcessAndExamBatchVO getProcessAndBatch(@Param("courseId") String courseId,
                                             @Param("coachId") Long coachId,
                                             @Param("subject") int subject,
                                             @Param("fraction") double fraction,
                                             @Param("userId") Long userId);

    ExamBatch getBatchForProcess(@Param("entity") Process entity);


    /**
     * 已毕业学员统计
     */
    List<Process> getGraduateStudent(String courseType);
    List<Process> getNoGraduateStudent(String courseType);

    /**
     *获取 科目二/三 通过学员
     */
    IPage<ProcessVO> getPassStudent(@Param("coachId")Long coachId, @Param("subject")int subject, @Param("courseType") String courseType, @Param("name") String name, @Param("sort") String sort,Page<ProcessVO> page);
    List<ProcessVO> getPassStudentList(@Param("coachId")Long coachId, @Param("subject")int subject, @Param("startTime") String startTime, @Param("endTime")String endTime);

    /**
     * 需要导出的数据
     */
    IPage<ProcessExportVO> getProcessExportData (@Param("entity") ProcessExportVO entity, Page<ProcessExportVO> page);
    ProcessExportVO getSubjectPassCount (@Param("entity") ProcessExportVO entity);

    /**
     * 学员考试合格率计算
     */
    List<ExamPassRateVO> getOverallPassingRate(@Param("subject")Integer subject, @Param("coachId")Long coachId, @Param("startTime") String startTime, @Param("endTime")String endTime);
    List<CoachExamPassRateVO> getPassingRateByCoachId(@Param("coachId")Long coachId, @Param("startTime") String startTime, @Param("endTime")String endTime);

    /**
     * 考试通过率计算获取
     */
    IPage<StudentPassInfoVO> getPassedStudentsByCoachAndExamNum(@Param("coachId")Long coachId, @Param("subject")Integer subject, @Param("examNum")Integer examNum, @Param("name")String name, @Param("courseType") String courseType, @Param("startTime") String startTime, @Param("endTime")String endTime, Page<StudentPassInfoVO> page);

    IPage<Process> getMyCourseStudentPage(@Param("entity") Process entity, Page<Process> page);

}
