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

import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.course.vo.*;
import cn.iocoder.yudao.module.exam.vo.ExamVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

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

/**
 * 学员课程进度 Service  接口
 *
 * @author lzt
 */
public interface ProcessService extends IService<Process> {

    /**
     * 教练查自己带教的课程和科目
     *
     * @return java.util.List<cn.iocoder.yudao.module.course.entity.Process>
     * @author vinjor-M
     * @date 11:05 2025/1/15
     **/
    List<Process> getMyCourseAndSubject();

    /**
     * 教练查自己带教的课程和科目在训练中的学生
     *
     * @param process 查询对象
     * @author vinjor-M
     * @date 17:11 2025/1/15
     **/
    IPage<Process> getMyCourseStudentPage(Process process, Page<Process> page);

    /**
     * 查某个学员在某个教练的某个课程、某个科目的学习进度（当前在练习中的）
     *
     * @param userId   学生id
     * @param courseId 课程id
     * @param subject  科目
     * @param coachId  教练id
     * @return cn.iocoder.yudao.module.course.entity.Process
     * @author vinjor-M
     * @date 18:39 2025/1/16
     **/
    Process getByStudentAndCourse(Long userId, String courseId, Integer subject, Long coachId, String examStatus);

    List<Process> getByStudentAndCourseByUniqueCode(String uniqueCode);

    /**
     * 查学生当下正在学习中的学习进度
     *
     * @param userId  用户id
     * @param coachId 教练id
     * @return cn.iocoder.yudao.module.course.entity.Process
     * @author vinjor-M
     * @date 16:39 2025/2/8
     **/
    Process selectByUserId(Long userId, Long coachId);

    /**
     * 查询教练 每个科目已毕未毕业学生数量
     *
     * @param coachId 教练id
     * @return java.util.Map<java.lang.String, java.lang.Integer>
     * @author vinjor-M
     * @date 13:52 2025/2/10
     **/
    Map<String, Integer> selectByCoachId(Long coachId);

    /**
     * 查某学生某课程累计总训练时长
     *
     * @param userId   学生ID
     * @param courseId 课程ID
     * @return java.lang.Double
     * @author vinjor-M
     * @date 14:17 2025/2/11
     **/
    Double getAllTrainTime(Long userId, String courseId);

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

    /**
     * 财务审核
     *
     * @param processVO {@link Process}
     * @author PQZ
     * @date 15:24 2025/2/18
     **/
    void checkProcess(ProcessVO processVO);

    /**
     * 保存学员课程进度
     *
     * @param request {@link Process}
     */
    void saveProcess(ProcessAddVO request);

    /**
     * 修改学院课程进度
     */
    void updateProcess(Process process);

    /**
     * 根据用户id和课程id查询所有进度
     * @param userId 用户id
     * @param courseId 课程id
     * @return java.util.List<cn.iocoder.yudao.module.course.vo.ProcessVO>
     */
    List<ProcessVO> getAllByUserIdAndCourseId(Long userId, String courseId);

    /**
     * 根据userId查询考试列表
     * @param userId 用户id
     */
    List<ProcessVO> getExamListByUserId(Long userId);
    List<ExamVO> getExamListByUserIdTest(Long userId);
    List<ExamVO> getExamListByUserIdTestNew(Long userId);

    /**
     * 教练自招自动分配教练
     */
    void autoAssignCoach(ProcessNewVO request);

    /**
     * 根据进度id查询进度详情，并且查询对应考试批次信息
     * 修改学员成绩时调用
     */
    ProcessAndExamBatchVO getProcessAndBatch(String id);


    /**
     * 根据进度id查询进度详情
     * @param id 进度id
     */
    ProcessVO getDlDriveSchoolCoach(String id);

    /**
     * 在录入成绩出修改教练
     */
    Boolean updateCoachForScoreInput(String id, Long coachId, String coachName);

    /**
     * 已毕业学员统计
     */
    List<Map<String, Object>> getGraduateStudent(String courseType);

    /**
     * 未毕业学员统计
     */
    List<Map<String, Object>> getNoGraduateStudent(String courseType);

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

    /**
     * 需要导出的数据
     * @param exportVO
     * @param page
     * @return
     */
    IPage<ProcessExportVO> getProcessExportData(ProcessExportVO exportVO, Page<ProcessExportVO> page);
    ProcessExportVO getSubjectPassCount(ProcessExportVO exportVO);

    /**
     * 导出数据的三种形式
     * @param exportVO
     * @return
     */
    List<ProcessExportVO> getProcessList(ProcessExportVO exportVO);
    List<ProcessExportVO> getAllProcessList(ProcessExportVO exportVO);
    List<ProcessExportVO> getProcessListByRange(ProcessExportVO exportVO);

    /**
     * 学员考试合格率计算
     */
    List<ExamPassRateVO> getExamPassRate(Integer subject, Long coachId, String timeType, String startTimeStr, String endTimeStr);

    /**
     * 学员考试合格率计算
     */
    List<CoachExamPassRateVO> getPassingRateByCoachId(Long coachId, String timeType, String startTimeStr, String endTimeStr);

    /**
     * 考试通过率计算获取
     */
    IPage<StudentPassInfoVO> getPassedStudentsByCoachAndExamNum(String timeType, Long coachId, Integer subject, Integer examNum, String name, String courseType, String startTimeStr, String endTimeStr, Page<StudentPassInfoVO> page);
}
