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

import cn.hutool.json.JSONUtil;
import com.seer.teach.common.context.PromptContextHolder;
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.springframework.stereotype.Service;

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

/**
 * 批改题目服务实现类，用于判断学生答案是否正确。
 * 继承自基础提示服务类，并实现了与AI模型交互以完成判断逻辑的功能。
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class CorrectQuestionService extends BasePromptService {

    private final AiModelCallService aiModelCallService;

    /**
     * 获取当前模块名称。
     *
     * @return 模块名："correctQuestions"
     */
    @Override
    public String getModule() {
        return "correctQuestions";
    }

    /**
     * 获取功能描述信息。
     *
     * @return 功能说明字符串："负责批改时判断学生答案是否正确"
     */
    @Override
    public String getFunctionName() {
        return "批改学生答案";
    }

    /**
     * 获取角色ID。
     *
     * @return 角色ID：3
     */
    @Override
    public Integer getRoleId() {
        return 3;
    }

    /**
     * 判断学生的答案是否正确。
     *
     * @param userId        用户ID
     * @param processResult 包含图片URL等处理结果的数据对象
     * @return 如果AI模型返回内容中包含"true"则表示答案正确，否则错误
     */
    public Boolean correct(Integer userId,
                           ProcessUploadResult processResult,
                           String ocrText,
                           String knowPoint,
                           String lostPoint,
                           String  ness) {
        insertContext(ocrText, knowPoint, lostPoint, ness);
        // 构造请求消息列表
        List<Message> reqMessages = getMessages(processResult);
        // 调用AI模型进行判断
        LlmResponse llmResponse = aiModelCallService.callModel(getModule(), reqMessages, null, userId);
        // 解析响应内容并判断结果
        String content = llmResponse.getChoices().get(0).getMessage().getContent();
        content = content.replaceAll("```json", "")
                .replaceAll("```", "")
                .trim();
        List<HashMap> bean = JSONUtil.  toList(content, HashMap.class);
        HashMap hashMap = bean.get(0);
        Object reason = hashMap.get("reason");
        Boolean correctNess = (Boolean) hashMap.get("correctNess");
        log.info("题目:{} 对错：{} knowPoint:{} ness:{} 原因：{}",ocrText,correctNess,knowPoint,ness,reason);
        return correctNess;
    }

    private static void insertContext(String ocrText, String knowPoint, String lostPoint, String ness) {
        PromptContextHolder.put(PromptContextHolder.OCR_TEXT, ocrText);
        PromptContextHolder.put(PromptContextHolder.KNOW_POINT, knowPoint);
        PromptContextHolder.put(PromptContextHolder.LOST_POINT, lostPoint);
        PromptContextHolder.put(PromptContextHolder.NESS, ness);
    }

    /**
     * 根据上传结果构造发送给AI模型的消息列表。
     *
     * @param processResult 处理后的上传数据，包括图像URL等信息
     * @return 构造好的消息列表，包含系统和用户消息
     */
    private List<Message> getMessages(ProcessUploadResult processResult) {
        // 生成预设的提示语映射表
        Map<String, List<Text>> promptMap = this.generatePromptMessages();
        // 提取用户和系统的文本片段
        List<Text> userTexts = promptMap.get(MessageEnums.USER.getMessage());
        List<Text> systemTexts = promptMap.get(MessageEnums.SYSTEM.getMessage());
        // 添加图像URL到用户输入中
        Text imageText = Text.imageUrl(processResult.getImage_url().getUrl());
        userTexts.add(imageText);
        // 封装成完整的用户和系统消息对象
        Message userMessage = Message.user(userTexts);
        Message systemMessage = Message.system(systemTexts);
        // 构建最终请求消息列表
        List<Message> reqMessages = new ArrayList<>();
        reqMessages.add(systemMessage);
        reqMessages.add(userMessage);
        return reqMessages;
    }

}
