package com.seer.teach.teacher.service;


import com.seer.teach.teacher.common.llm.req.*;
import com.seer.teach.teacher.common.llm.resp.*;
import com.seer.teach.teacher.common.req.QuestionCorrectReq;
import com.seer.teach.teacher.common.resp.SubjectScoreResp;
import org.springframework.web.multipart.MultipartFile;

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

/**
 * @Author: Captain
 * @Description:
 * @Date: 2025-06-10 14:18
 */
public interface LlmRequestService {

    /**
     * 请求LLM进行题目批改
     *
     * @param req 题目批改请求参数对象，包含需要批改的题目信息
     * @return 题目批改响应对象，包含批改结果和相关信息
     */
    QuestionsCorrectLlmResult requestLlmForQuestionsCorrect(QuestionsCorrectLlmReq req);

    /**
     * 请求LLM获取题目列表
     *
     * @return LLM题目响应列表，包含从LLM获取到的题目信息
     */
    List<Integer> requestLlmGetPlanQuestions(LlmGetPlanQuestionReq params);

    /**
     * 请求LLM推荐章节
     *
     * @param userId 用户ID，用于标识请求推荐的用户
     * @return 推荐章节列表，包含LLM推荐的章节信息
     */
    List<LlmRecommendChapterResult> requestLlmForRecommendChapters(Integer userId);

    /**
     * 请求LLM进行语音转文字处理
     *
     * @param userQuestion 用户上传的音频文件，包含语音问题内容
     * @param userId       用户唯一标识符，用于识别请求来源用户
     * @return 转换后的文字内容，如果转换失败则返回null或空字符串
     */
    String requestLlmForStt(MultipartFile userQuestion, Integer userId);

    /**
     * 获取LLM潜能信息
     *
     * @param score 主题分数列表，包含各个主题的评分信息
     * @return LLM评论响应对象，包含评论相关的内容和状态信息
     */
    LlmCommentResult getLlmComment(Integer userId, List<SubjectScoreResp> score);

    /**
     * 构建LLM题目批改请求参数对象
     *
     * @param userId 用户ID，用于标识请求的来源用户
     * @param params 待处理的题目批改参数列表
     * @return 构建后的LLM题目批改请求参数对象
     */
    QuestionsCorrectLlmReq buildLlmQuestionCorrectLlmReq(Integer userId, Integer type, List<QuestionCorrectReq> params, Map<Integer, Integer> idQuestionIdMaps);

    /**
     * 执行OCR识别操作
     *
     * @param userId 用户ID，用于标识执行OCR操作的用户
     * @param file 待识别的文件，通常为图片格式
     * @return OCR识别结果，包含识别出的文本内容及相关信息
     */
    BboxResult requestBbox(Integer userId, MultipartFile file);

    /**
     * 处理上传的文件
     *
     * @param userId 用户ID，用于标识处理上传文件的用户
     * @param base64 待处理的文件，通常为base64编码过后的
     * @return 处理结果，包含处理后的文件信息及相关信息
     */
    ProcessUploadResult requestProcessUpload(Integer userId, String base64);

    /**
     * 请求关于单个问题的上下文信息
     *
     * @param userId 用户ID，用于标识请求用户的身份
     * @param url 图片或资源的URL地址，用于获取相关资源
     * @param bbox 边界框坐标列表，每个子列表包含[x1, y1, x2, y2]格式的坐标信息，用于定位问题相关的区域
     * @return 返回与指定问题相关的上下文信息字符串
     */
    String requestContextAboutSingleQuestion(Integer userId,String url,List<Integer> bbox);


    /**
     * 发送GET请求获取文本的Base64编码
     *
     * @param userId 用户ID，用于标识请求的用户身份
     * @param cropedImgBase64 裁剪后的图片Base64编码字符串
     * @return 返回请求获取到的文本内容的Base64编码字符串
     */
    String requestOcrWithBase64(Integer userId,String cropedImgBase64);

}
