package com.supervision.service.impl;

import cn.hutool.core.util.StrUtil;
import com.supervision.pojo.ai.AiTalkAnswerDTO;
import com.supervision.service.AiService;
import com.supervision.util.AiChatUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Service;

import java.util.*;

@Slf4j
@Service
public class AiServiceImpl implements AiService {

    public static final String userPromptTemplate = """
            预设病例的基本情况如下:
            ---
            {medicalRecord}
            ---
            回复格式为json:{"answer":"扮演病人并根据病历回复的内容"}
            """;

    private static final String systemPrompt = """
            我们现在来进行一个角色扮演连续对话场景。
            你现在扮演一个病人的角色,我来扮演医生,我们进行模拟问诊。
            我会给你设定病人的病历,你根据给定病历内容进行回复。
            如果病历中信息不能回问题,则回复'我不知道/没注意/不清楚'",所有问话都必须给回复!
            如果医生说'你好'等礼貌用语,你就回复'你好,医生'!!!
            """;

    /**
     * 根据病历进行回复
     *
     * @param question 医生的问题
     * @return 大模型回答的问题
     */
    public String talk(String question, String medicalRecord) {
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("medicalRecord", medicalRecord);
        List<Message> messageHistoryList = new ArrayList<>();
        messageHistoryList.add(new SystemMessage(systemPrompt));
        messageHistoryList.add(new UserMessage(StrUtil.format(userPromptTemplate, paramMap)));
        messageHistoryList.add(new AssistantMessage("好的,已了解我要扮演病人的病历。已准备好对话了。"));
        messageHistoryList.add(new UserMessage(question));
        Optional<AiTalkAnswerDTO> chat = AiChatUtil.chat(messageHistoryList, AiTalkAnswerDTO.class);
        if (chat.isPresent()) {
            AiTalkAnswerDTO aiTalkAnswerDTO = chat.get();
            if (StrUtil.isNotBlank(aiTalkAnswerDTO.getAnswer())) {
                return aiTalkAnswerDTO.getAnswer();
            }
        }
        return "医生,我没有听懂你说的是什么";
    }


}