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

import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO;
import cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO;
import cn.iocoder.yudao.module.base.vo.DriveSchoolStudentExportVo;
import cn.iocoder.yudao.module.base.vo.StudentCountVO;
import cn.iocoder.yudao.module.inspection.query.InspectionStaffQuery;
import cn.iocoder.yudao.module.inspection.vo.InspectionStaffExportVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.validation.Valid;
import java.util.Date;
import java.util.List;

/**
 * 驾校学员 Service 接口
 *
 * @author pqz
 */
public interface DlDriveSchoolStudentService extends IService<DlDriveSchoolStudent> {

    /**
     * 创建驾校学员
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createDlDriveSchoolStudent(@Valid DlDriveSchoolStudentVO createReqVO);

    /**
     * 根据身份证查询学员是否已存在
     *
     * @param userId 用户id
     *               return  boolean
     */
    DlDriveSchoolStudent getStudentByIdCard(Long userId);

    /**
     * 获取学员详细信息
     *
     * @param id 学员id
     * @return cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO
     * @author PQZ
     * @date 9:58 2025/2/10
     **/
    DlDriveSchoolStudentVO queryStudentById(String id);

    /**
     * 更新驾校学员
     *
     * @param updateReqVO 更新信息
     */
    void updateDlDriveSchoolStudent(@Valid DlDriveSchoolStudentVO updateReqVO);

    /**
     * 删除驾校学员
     *
     * @param id 编号
     */
    void deleteDlDriveSchoolStudent(String id);

    /**
     * 获得驾校学员
     *
     * @param id 编号
     * @return 驾校学员
     */
    DlDriveSchoolStudent getDlDriveSchoolStudent(String id);

    /**
     * 根据userID查学员详情
     *
     * @param userId 用户ID
     * @return cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent
     * @author vinjor-M
     * @date 22:17 2025/1/20
     **/
    DlDriveSchoolStudent getStudentByUserId(Long userId);

    /**
     * 分页查询学生列表
     *
     * @param pageReqVO {@link DlDriveSchoolStudentVO}
     * @param page      分页参数
     * @return com.baomidou.mybatisplus.core.metadata.IPage<?>
     * @author PQZ
     * @date 10:41 2025/1/18
     **/
    IPage<DlDriveSchoolStudentVO> queryListPage(DlDriveSchoolStudentVO pageReqVO, Page<DlDriveSchoolStudentVO> page);

    /**
     * 获取可以考试的学员列表
     *
     * @param courseId 课程ID
     * @param subject  科目
     * @return List<DlDriveSchoolStudent>
     * @author vinjor-M
     * @date 23:16 2025/1/20
     **/
    List<DlDriveSchoolStudent> getCanExamStudentList(String courseId, Integer subject, String userName);

    /**
     * 手机端获取学员
     *
     * @param staffVO {@link DlDriveSchoolStaffVO}
     * @param page    分页参数
     * @return com.baomidou.mybatisplus.core.metadata.IPage<cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO>
     * @author PQZ
     * @date 14:47 2025/2/6
     **/
    IPage<DlDriveSchoolStaffVO> pageStaffStudent(DlDriveSchoolStaffVO staffVO, Page<DlDriveSchoolStaffVO> page);

    /**
     * 教练查自己所有学生列表
     *
     * @param pageReqVO {@link DlDriveSchoolStudentVO}
     * @param page      分页参数
     * @return com.baomidou.mybatisplus.core.metadata.IPage<?>
     * @author PQZ
     * @date 10:41 2025/1/18
     **/
    IPage<DlDriveSchoolStudentVO> queryCoachListPage(DlDriveSchoolStudentVO pageReqVO, Page<DlDriveSchoolStudentVO> page);
    IPage<DlDriveSchoolStudentVO> queryBusinessListPage(DlDriveSchoolStudentVO pageReqVO, Page<DlDriveSchoolStudentVO> page);

    /**
     * @param type      时间查询类型（01驾校统招，02教练自招，03自来客户）
     * @param coachId   教练id
     * @param startTime 查询时间范围--开始
     * @param endTime   查询时间范围--结束
     * @return java.util.List<cn.iocoder.yudao.module.base.vo.StudentCountVO>
     * @author PQZ
     * @date 17:08 2025/2/19
     **/
    List<StudentCountVO> indexGetTrainList(String type, Long coachId, String startTime, String endTime);

    /**
     * 查自来客户
     *
     * @param startTimeStr 查询时间范围--开始
     * @param endTimeStr   查询时间范围--结束
     * @return cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO
     * @author PQZ
     * @date 11:43 2025/2/20
     **/
    List<DlDriveSchoolStaffVO> indexGetFormList(String startTimeStr, String endTimeStr);

    /**
     * 更新学员拿证时间
     *
     * @param passTime 拿证日期
     * @param userId   学员id
     * @param courseId 课程id
     * @param tenantId 租户id
     */
    Boolean updateStudentPassAndGradTime(Date passTime, Long userId, String courseId, Long tenantId);
    Boolean updateStudentGradTime(Long userId, String courseId, Long tenantId);
    Boolean adminUpdateStudentPassAndGradTime(Date passTime,Date gradTime, Long userId, String courseId, Long tenantId);

    /**
     * 根据唯一码查询学员信息
     *
     * @param uniqueCode 唯一码
     * @return cn.iocoder.yudao.module.base.vo.DlDriveSchoolStaffVO
     */
    DlDriveSchoolStudentVO queryStudentByUniqueCode(String uniqueCode);

    /**
     * 添加文件夹
     *
     * @param userId 用户id
     * @return 文件夹id
     */
    Long addFolder(Long userId);

    /**
     * 获取所有学员信息
     *
     * @param query
     * @return
     */
    List<DriveSchoolStudentExportVo> getAll(DlDriveSchoolStudent query);
}
