package com.seer.teach.teacher.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.seer.teach.teacher.common.resp.QuestionsCorrectDTO;
import com.seer.teach.teacher.common.dto.QuestionSetDTO;
import com.seer.teach.teacher.common.llm.resp.QuestionsCorrectLlmResult;
import com.seer.teach.teacher.common.req.QuestionCorrectReq;
import com.seer.teach.teacher.common.req.UpdateExamTopicPointReq;
import com.seer.teach.teacher.common.resp.DoExerciseResp;
import com.seer.teach.teacher.module.entity.BankQuestionsEntity;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author Wang
 * @since 2025-10-25 18:58:18
 */
public interface BankQuestionsService extends IService<BankQuestionsEntity> {

    /**
     * 分页查询题库问题列表
     *
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @param type     题库类型
     * @return 分页后的题库问题列表
     */
    IPage<BankQuestionsEntity> selectPage(Integer pageNum, Integer pageSize,Integer type);

    /**
     * 查询用户已完成的题目ID集合
     *
     * @param userId 用户ID
     * @param id     题目ID
     * @return 题目集DTO列表
     */
    List<QuestionSetDTO> selectDoneQuestionIds(Integer userId, Integer id);

    /**
     * 生成评估题目列表
     *
     * @param userId        用户ID
     * @param knowId        知识点ID
     * @param questionCount 题目数量
     * @return 银行题目实体列表
     */
    List<BankQuestionsEntity> generateEvaluationQuestions(Integer userId, Integer knowId, Integer questionCount);

    /**
     * 构建题目批改结果
     *
     * @param llmResult  大语言模型批改结果
     * @param type       题目类型
     * @param bigDecimal 分数
     * @param recordId   记录ID
     * @param params     题目批改请求参数列表
     * @param useTime    使用时间
     * @return 题目批改DTO
     */
    QuestionsCorrectDTO buildCorrectResult(QuestionsCorrectLlmResult llmResult, Map<Integer, Integer> idQuestionIdMaps, Integer type, BigDecimal bigDecimal, Integer recordId, Set<Integer> params, int useTime);

    /**
     * 更新考试题目得分
     *
     * @param req 更新考试题目得分请求参数
     */
    void updateExamTopicPoint(UpdateExamTopicPointReq req);

    /**
     * 构建做题响应对象
     *
     * @param taskId        任务ID
     * @param questions     题目列表
     * @param ids           题目ID列表
     * @param idQuestionMap 题目ID与题目映射关系
     * @param code          状态码
     * @return 做题响应对象
     */
    DoExerciseResp buildDoExerciseResp(Integer taskId,
                                       List<BankQuestionsEntity> questions,
                                       List<Integer> ids,
                                       Map<Integer, Integer> idQuestionMap,
                                       Integer code
    );

}
