package jnpf.cultivate.v2.service;

import com.github.pagehelper.PageInfo;
import jnpf.base.service.SuperService;
import jnpf.model.cultivate.req.exam.SubExamQuestionReq;
import jnpf.model.cultivate.req.exam.WebRestartExamReq;
import jnpf.model.cultivate.resp.SubExamVo;
import jnpf.model.cultivate.v2.exam.po.CultivateExam;
import jnpf.model.cultivate.v2.exam.req.*;
import jnpf.model.cultivate.v2.exam.vo.*;

import java.util.List;

/**
 * 考试服务v2
 *
 * @author yanwenfu
 * @create 2026-02-27
 */
public interface V2CultivateExamService extends SuperService<CultivateExam> {

    /**
     * 考试列表[分页]
     * @param req 查询参数
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.exam.vo.V2ExamListVo>
     */
    PageInfo<V2ExamListVo> getPage(V2QueryExamReq req);

    /**
     * 新增岗位/自定义考试
     * @param req 考试参数
     */
    void addExam(V2SaveExamReq req) throws Exception;

    /**
     * 编辑岗位/自定义考试
     * @param id 考试id
     * @param req 考试参数
     */
    void updateExam(String id, V2SaveExamReq req) throws Exception;

    /**
     * 考试详情
     * @param id 考试id
     * @param copy 是否复制(1: 是, 0: 否)
     */
    V2ExamVo getDetail(String id, Integer copy);

    /**
     * 批阅详情
     * @param id 考试id
     * @return jnpf.model.cultivate.v2.exam.vo.V2ExamDetailVo
     */
    V2ExamDetailVo getMarkDetail(String id);

    /**
     * 批阅详情 - 列表[分页]
     * @param req 请求参数
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.exam.vo.V2TestPaperVo>
     */
    PageInfo<V2TestPaperVo> getMarkDetailPage(MarkDetailQueryReq req);

    /**
     * 删除考试
     * @param id 考试id
     */
    void delExam(String id) throws Exception;

    /**
     * 我的考试[分页]
     * @param req 请求参数
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.exam.vo.MyExamVo>
     */
    PageInfo<MyExamVo> myExamList(V2AppQueryExamListReq req);

    /**
     * 我的考试[tab count]
     * @return jnpf.model.cultivate.v2.exam.vo.MyExamTabCountVo
     */
    MyExamTabCountVo getMyExamTabCount();

    /**
     * 我的考试 - 详情
     * @param userExamId 用户考试id
     * @return jnpf.model.cultivate.v2.exam.vo.MyExamDetailVo
     */
    MyExamDetailVo myExamDetail(String userExamId);

    /**
     * 开始考试 - 查询试题
     * @param userExamId 用户考试id
     * @return java.util.List<jnpf.model.cultivate.v2.exam.vo.V2AppQuestionVo>
     */
    List<V2AppQuestionVo> getExamQuestionList(String userExamId) throws Exception;

    /**
     * 批阅考试 - 考试列表[分页]
     * @param req 请求参数
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.exam.vo.ReadOverExamVo>
     */
    PageInfo<ReadOverExamVo> readOverExamList(QueryReadOverExamListReq req);

    /**
     * 批阅考试[tab count]
     * @return jnpf.model.cultivate.v2.exam.vo.ReadOverTabCountVo
     */
    ReadOverTabCountVo getReadOverTabCount(List<String> organizeList);

    /**
     * 批阅考试 - 排行榜[分页]
     * @param req 请求参数
     * @return jnpf.model.cultivate.v2.exam.vo.UserExamRankVo
     */
    UserExamRankVo getExamRankList(ExamRankReq req);

    /**
     * 抽取题目数量及分值
     * @param bankIdList 题库ids
     * @return jnpf.model.cultivate.v2.exam.vo.BankAnalysisVo
     */
    BankAnalysisVo getBankAnalysis(List<String> bankIdList);

    /**
     * 选择题目
     * @param req 查询条件
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.exam.vo.QuestionVo>
     */
    PageInfo<QuestionVo> getQuestionPage(QuestionReq req);

    /**
     * 题目删除后考试处理为异常
     * @param questionIds 题目ids
     */
    void questionChangeDeal(List<String> questionIds);

    /**
     * 重新考试
     * @param userExamId 用户考试id
     * @return java.lang.String
     */
    String restartExam(String userExamId) throws Exception;

    /**
     * 重新考试 - 带次数验证
     * @param userExamId 用户考试id
     * @return java.lang.String
     */
    String restartExamWithValid(String userExamId) throws Exception;

    /**
     * 验证是否可以重新考试[app&web]
     * @param userExamId 用户考试id
     * @return java.lang.Boolean
     */
    Boolean checkRestartExam(String userExamId) throws Exception;

    void checkAndUpdateExpireUserExamStatus();

    void checkAndUpdateExamStatus();

    void webRestartExam(WebRestartExamReq req);

    /**
     * 提交试卷
     * @param userExamId 用户考试id
     * @param req 请求参数
     * @return jnpf.model.cultivate.resp.SubExamVo
     */
    SubExamVo subUserExam(String userExamId, SubExamQuestionReq req);

    /**
     * 培训1.0旧数据处理
     * @return java.lang.Boolean
     */
    Boolean dealExamOldData();

    /**
     * 删除用户的考试
     * @param userExamId 用户的考试id
     */
    void delUserExam(String userExamId) throws Exception;

    /**
     * 查看考卷详情
     * @param userExamId 用户的考试id
     * @return jnpf.model.cultivate.v2.exam.vo.PaperDetailVo
     */
    PaperDetailVo getMarkPaperDetail(String userExamId) throws Exception;

    /**
     * 我的考试列表[web](分页)
     * @param queryDto 查询参数
     * @return com.github.pagehelper.PageInfo<jnpf.model.cultivate.v2.exam.vo.MyExamWebVo>
     */
    PageInfo<MyExamWebVo> getMyExamWebPage(MyExamWebQueryDto queryDto);
}
