package jnpf.cultivate.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import jnpf.model.cultivate.po.exam.FtbCultivateExam;
import jnpf.model.cultivate.po.exam.FtbCultivateExamUser;
import jnpf.model.cultivate.po.learn.FtbCultivateLearnTask;
import jnpf.model.cultivate.req.exam.QueryExamReq;
import jnpf.model.cultivate.req.exam.SaveExamReq;
import jnpf.model.cultivate.req.exam.WebQueryExamReadOverReq;
import jnpf.model.cultivate.req.paper.PaperConfigReq;
import jnpf.model.cultivate.resp.*;
import jnpf.model.personnels.dto.authoritys.PermissionsCacheDTO;
import jnpf.permission.vo.v2.position.PositionAndGradesVO;
import jnpf.permission.vo.v2.position.PositionVO;

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

/**
 * 考试服务接口
 *
 * @author xgl
 * @create 2024-09-29
 */
public interface FtbCultivateExamService extends IService<FtbCultivateExam> {

    /**
     * 根据试卷ID查询考试列表
     *
     * @param paperId 试卷ID
     * @return
     */
    List<ExamVo> queryExamListByPaperId(String paperId);


    /**
     * 查询考试列表
     *
     * @param req
     * @return
     */
    PageInfo<ExamListVo> getPageList(QueryExamReq req);

    /**
     * 根据考试ID 查询试卷信息
     *
     * @param examId 考试ID
     * @return
     */
    PaperVo queryPaperInfoForExamId(String examId);

    /**
     * 查询批阅角色
     *
     * @return
     */
    List<ReviewerRole> queryRoleReviewerList();

    /**
     * 根据考试ID列表 查询试卷信息
     *
     * @param examIds 考试ID列表
     * @return examId -> PaperVo 的map
     */
    Map<String, PaperVo> queryPaperInfoForExamIds(List<String> examIds);

    /**
     * 根据考试ID列表查询考试信息和考试的试卷基本信息
     *
     * @param examIds
     * @return
     */
    List<AppExamVo> queryExamAndPaperInfo(List<String> examIds);

    /**
     * 查询考试详情
     *
     * @param examId 考试ID
     * @return
     */
    ExamVo getInfo(String examId);

    /**
     * 新增考试
     *
     * @param req
     */
    void insertData(SaveExamReq req);

    /**
     * 修改考试
     *
     * @param req
     */
    void updateData(SaveExamReq req);

    /**
     * 删除考试
     *
     * @param examId 考试ID
     */
    void deleteData(String examId);

    /**
     * 检查是否可以删除
     *
     * @param examId 考试ID
     * @return
     */
    CanDeleteMsg checkExamCanDelete(String examId);

    /**
     * 查询所有的岗位和考试
     *
     * @return
     */
    List<PositionAndGradesVO> queryPostAndRank();

    /**
     * 查询考试详情[考试 和 试卷]
     *
     * @param examId 考试ID
     * @return
     */
    ExamAndPaperDetailVo queryExamDetail(String examId);

    /**
     * APP查询考试信息
     *
     * @param examId
     * @return
     */
    ExamAppVo examInfo(String examId);

    /**
     * 根据考试id查询考试题目
     *
     * @param examId 考试id
     * @return
     */
    List<UserQuestionVo> queryExamQuestionList(String examId);

    /**
     * 根据用户考试记录ID查询考试题目
     *
     * @param userExamId 用户考试记录id
     * @return 考试的题目列表
     */

    List<UserQuestionVo> queryExamQuestionListByUserExamId(String userExamId);

    /**
     * 查询考试的试卷信息
     *
     * @param examId 考试ID
     * @return
     */
    PaperDetailVo queryCurrExamPaperInfo(String examId);

    /**
     * 查询考试信息
     *
     * @param examId 考试id
     * @return
     */
    FtbCultivateExam queryExamInfo(String examId);

    /**
     * 查询考试 和岗位是否有绑定关系
     *
     * @param examId     考试ID
     * @param positionId 岗位ID
     * @return 非null--有绑定     null--无绑定
     */
    FtbCultivateExam queryExamAndPositionRelation(String examId, String positionId);

    /**
     * 考试 和岗位进行绑定
     *
     * @param examId     考试ID
     * @param positionId 岗位ID
     * @return true--成功    false--失败
     */
    Boolean bindExamAndPositionRelation(String examId, String positionId);

    /**
     * 查询批阅人列表
     *
     * @return
     */
    List<ExamBaseUser> queryReviewerUserList();

    /**
     * 修改常规考试状态
     */
    void changeExamStatus();

    /**
     * 分析试卷 各类型题目数量
     *
     * @param paperId 试卷ID
     * @return
     */
    Map<String, PaperConfigReq.QuestionNum> analysPaperQuestionCount(String paperId);

    /**
     * 填充批阅人 和阅卷角色
     *
     * @param examUser 用户考试记录
     * @param exam     考试信息
     */
    void fillRevierwer(FtbCultivateExamUser examUser, FtbCultivateExam exam);

    /**
     * 查询批阅人列表
     *
     * @param loginUserId 用户id
     * @return
     */
    List<String> queryExamReviewList(String loginUserId);

    /**
     * 查询所有的岗位
     *
     * @return
     */
    List<PositionVO> queryAllPostion();

    /**
     * 根据考试id查询考试相关的历史试卷
     *
     * @param req
     * @return
     */
    List<WebReadOverExamAndPaperDetailVo> historyPaperList(WebQueryExamReadOverReq req);

    /**
     * 考试作废-常规考试
     *
     * @param id 考试ID
     * @return
     */
    void nullify(String id);

    /**
     * 根据岗位查询是否考试完成才能够鉴定的标志
     *
     * @param positionId 岗位 id
     * @return
     */
    Integer queryExamAndIdentifyConfig(String positionId);

    /**
     * 查询考试历史试卷待考试的数量
     *
     * @param req
     * @return
     */
    Map<String, Integer> waitNumberForBatch(WebQueryExamReadOverReq req);

    /**
     * 初始化考试数据(兼容旧数据)
     *
     * @return
     */
    List<String> initOldExamData();

    /**
     * 旧数据清洗，删除已经删除的考试 的相关考试记录
     */
    void deleteExamUserForDeleteExam();

    /**
     * 填充考试的批阅人信息
     *
     * @param examUser            考试用户记录薪酬
     * @param exam                考试信息
     * @param permissionsCacheDTO 考试的权限信息
     */
    void fillRevierwerNew(FtbCultivateExamUser examUser, FtbCultivateExam exam, PermissionsCacheDTO permissionsCacheDTO);

    /**
     * 查询考试关联的任务列表
     *
     * @param id 考试ID
     * @return
     */
    List<FtbCultivateLearnTask> checkNullify(String id);
}
