package com.seer.teach.teacher.service.prompt.impl;

import com.seer.teach.common.enums.MessageEnums;
import com.seer.teach.teacher.common.llm.resp.ProcessUploadResult;
import com.seer.teach.teacher.common.llm.sse.req.Message;
import com.seer.teach.teacher.common.llm.sse.req.Text;
import com.seer.teach.teacher.service.AiModelCallService;
import com.seer.teach.teacher.service.platform.LlmResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;

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

/**
 * 题目完整性校验服务实现类。
 * <p>
 * 该类用于判断上传的图片中是否包含完整的题目信息。通过调用大模型接口分析 OCR 结果及对应图像，
 * 判断每道题目的图像是否满足“题目完整”的标准，并将符合要求的结果返回。
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class CorrectKnowledgePointService extends BasePromptService {

    private final AiModelCallService aiModelCallService;


    @Override
    public String getModule() {
        return "correctKnowledgePoint";
    }

    @Override
    public String getFunctionName() {
        return "解析题目知识点";
    }

    @Override
    public Integer getRoleId() {
        return 5;
    }


    /**
     * 校验题目完整性主方法。
     * <p>
     * 对传入的 OCR 提取结果进行逐项验证，结合对应的图像地址，使用 AI 大模型判断其是否构成一个完整题目。
     *
     * @param userId     用户ID，标识请求来源用户
     * @param ocrResults OCR识别结果列表，包含各题目的位置与文本信息
     * @return 符合完整性条件的 OCR 结果列表
     */
    public String knowledgePoint(Integer userId,
                                                  String ocrText,
                                                  ProcessUploadResult processUploadResult){
        List<Message> messages = getMessages(ocrText, processUploadResult);
        LlmResponse llmResponse = aiModelCallService.callModel(getModule(), messages, null, userId);
        return llmResponse.getChoices().get(0).getMessage().getContent();

    }

    @NotNull
    private List<Message> getMessages(String ocrText, ProcessUploadResult processUploadResult) {
        Map<String, List<Text>> prompt = this.generatePromptMessages();
        List<Text> userTexts = prompt.get(MessageEnums.USER.getMessage());
        List<Text> systemTexts = prompt.get(MessageEnums.SYSTEM.getMessage());
        userTexts.addAll(Text.text(ocrText));
        userTexts.add(Text.imageUrl(processUploadResult.getImage_url().getUrl()));
        Message systemMessage = Message.system(systemTexts);
        Message userMessage = Message.user(userTexts);
        List<Message> messages = new ArrayList<>();
        messages.add(systemMessage);
        messages.add(userMessage);
        return messages;
    }

}
