package com.fs.fastgptApi.service.Impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fs.common.core.domain.R;
import com.fs.fastgptApi.config.FastGptApiConfig;
import com.fs.fastgptApi.param.ChatParam;
import com.fs.fastgptApi.result.ChatDetailFStreamFResult;
import com.fs.fastgptApi.result.ChatDetailTStreamFResult;
import com.fs.fastgptApi.result.KnowledgeBaseResult;
import com.fs.fastgptApi.service.ChatService;
import com.fs.fastgptApi.util.HttpUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class ChatServiceImpl implements ChatService {


    /**
     * 发起对话
     */
    @Override
    public R initiatingTakeChat(ChatParam param,String url,String appKey) {

        String json = HttpUtil.sendPost(param, url+FastGptApiConfig.completionsUrl, appKey);

        JSONObject jsonObject = JSON.parseObject(json);

        // 判断是否有回应消息
        if(jsonObject.containsKey("choices")){
            // 获取消息列表
            JSONArray choices = jsonObject.getJSONArray("choices");
            // 回复消息不为空
            if(!choices.isEmpty()){
                // 判断是否转人工
                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("【转人工】")){
                    jsonObject.put("artificial", true);
                }
                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("FunctionCallBegin")){
                    jsonObject.put("artificial", true);
                }
                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("【长对话】")){
                    jsonObject.put("longText", true);
                }



                // 替换AI回复里面的所有的【】包括里面的字符串
                List<JSONObject> list = choices.stream().map(e -> {
                    JSONObject result = JSON.parseObject(e.toString());
                    JSONObject message = result.getJSONObject("message");
                    message.put("content", message.getString("content"));
                    return result;
                }).collect(Collectors.toList());
                jsonObject.put("choices", list);
            }
        }
        // 判断是否匹配知识库逻辑
        if(jsonObject.containsKey("responseData")){
            // 遍历查找主对话框
            JSONArray responseData = jsonObject.getJSONArray("responseData");
            // 筛选出主对话框里面的信息，里面的historyPreview是匹配信息
            responseData.stream().filter(e -> "主对话框".equals(JSON.parseObject(e.toString()).getString("moduleName"))).findFirst().ifPresent(e -> {
                // 进入方法证明以及查找主对话框
                JSONObject eJson = JSON.parseObject(e.toString());
                // 如果主对话框里面信息为空则不处理
                if(!eJson.containsKey("historyPreview") || StringUtils.isEmpty(eJson.getString("historyPreview"))) return;
                // 循环里面的所有数据
                JSONArray historyPreview = eJson.getJSONArray("historyPreview");
                // 判断是否包含未匹配信息  -> true：未匹配到知识库  false：已匹配到知识库
                boolean knowledge = historyPreview.stream().anyMatch(h -> {
                    JSONObject hJson = JSON.parseObject(h.toString());
                    return hJson.getString("value").contains("<Data>\n\n</Data>");
                });
                // 之所以取反，是为了后面实体类方便查看
                jsonObject.put("knowledge", !knowledge);
            });
        }


        if (jsonObject.containsKey("code") && !("200".equals(jsonObject.getString("code")))) {
            return R.error().put("data", JSON.parseObject(json, KnowledgeBaseResult.class));
        }
        if (!param.getDetail() && !param.getStream()){

            ChatDetailFStreamFResult result = jsonObject.toJavaObject(ChatDetailFStreamFResult.class);

            return R.ok().put("data", result);
        }
        // flase true 的方式不建议(即stream流的方式)，都是输出完才返回，没意义
        if (!param.getDetail() && param.getStream()){

//            ChatDetailFStreamTResult result = jsonObject.toJavaObject(ChatDetailFStreamTResult.class);

            return R.ok().put("data", json);
        }

        if (param.getDetail()&&!param.getStream()){
            ChatDetailTStreamFResult result = jsonObject.toJavaObject(ChatDetailTStreamFResult.class);
            return R.ok().put("data", result);
        }

        // true true 的方式不建议(即stream流的方式)，都是输出完才返回，没意义
        if (param.getDetail()&&param.getStream()){

            return R.ok().put("data", json);
        }
        return null;
    }





}
