package com.sonic.cow.utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sonic.cow.domain.bo.ChatOutputTextBo;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

@Slf4j
public class JsonExtractor {

    /**
     * 提取 JSON 字符串中的 message 值，并封装到 ChatOutputTextBo 对象中。
     *
     * @param input 输入的字符串，包含 JSON 和可能的非 JSON 内容
     * @return ChatOutputTextBo 对象，包含 message 和 score，如果解析失败则返回默认对象
     */
    public static ChatOutputTextBo extractMessageAndScore(String input) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            // 清理输入，提取可能的 JSON 部分（假设 JSON 以 { 开头，以 } 结尾）
            String jsonString = extractJsonString(input);
            if (jsonString != null) {
                JsonNode node = mapper.readTree(jsonString);
                if (node.has("message") && node.has("score")) {
                    return ChatOutputTextBo.builder()
                            .message(node.get("message").asText())
                            .score(BigDecimal.valueOf(node.get("score").asDouble()))
                            .build();
                }
            }
        } catch (Exception e) {
            log.error("Failed to parse JSON: ",  e);
        }
        // 默认返回值
        return ChatOutputTextBo.builder()
                .message(input)
                .score(new BigDecimal("0"))
                .build();
    }

    /**
     * 从输入字符串中提取有效的 JSON 部分。
     *
     * @param input 输入字符串
     * @return 提取的 JSON 字符串，如果无法提取则返回 null
     */
    private static String extractJsonString(String input) {
        if (input == null || input.trim().isEmpty()) {
            return null;
        }
        // 找到 JSON 对象的起始和结束位置
        int startIndex = input.indexOf("{");
        int endIndex = input.lastIndexOf("}");
        if (startIndex != -1 && endIndex != -1 && endIndex > startIndex) {
            return input.substring(startIndex, endIndex + 1).replace("\\n", "");
        }
        return null;
    }

}