package com.ruoyi.cms.util;

import org.springframework.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 文本内容清理工具类：移除思维链、提取有效业务文本
 * 核心能力：
 * 1. 优先提取 <file_upload> 标签内的有效文本（自动剔除标签外的思维链）
 * 2. 无 file_upload 标签时，移除  标签及内部的思维链
 * 3. 统一清理文本格式（多余换行/空格、末尾问号）
 */
public class ChatTextCleanUtil {

    // 正则常量：匹配 <file_upload> 标签及内部内容（提取标签内文本）
    private static final String PATTERN_FILE_UPLOAD = "\\<file_upload\\>(.*?)\\</file_upload\\>";
    // 正则常量：匹配  标签及内部的思维链内容
    private static final String PATTERN_THINK_CHAIN = "\\<think\\>.*?\\</think\\>";
    // 正则常量：匹配多个换行符
    private static final String PATTERN_MULTI_NEWLINE = "\\n+";
    // 正则常量：匹配多个空白字符（空格/制表符等）
    private static final String PATTERN_MULTI_SPACE = "\\s+";
    // 正则常量：匹配末尾的问号
    private static final String PATTERN_TRAILING_QUESTION = "\\?$";

    /**
     * 清理文本中的思维链，提取有效业务内容
     *
     * @param content 原始文本内容（可能包含思维链、file_upload标签等）
     * @return 清理后的纯业务文本，空值/空文本返回原内容
     */
    public static String removeThinkChain(String content) {
        // 空值/空文本直接返回，避免后续处理
        if (!StringUtils.hasText(content)) {
            return content;
        }

        // 提取有效文本（优先处理file_upload标签）
        String validContent = extractFileUploadContent(content);
        // 若未提取到file_upload内容，移除think标签的思维链
        if (!StringUtils.hasText(validContent)) {
            validContent = cleanThinkChainContent(content);
        }

        // 统一格式化文本（清理多余换行/空格、末尾问号）
        return formatText(validContent);
    }

    /**
     * 提取 <file_upload> 标签内的文本内容
     *
     * @param content 原始文本
     * @return 标签内的文本（无标签返回空字符串）
     */
    private static String extractFileUploadContent(String content) {
        Pattern pattern = Pattern.compile(PATTERN_FILE_UPLOAD, Pattern.DOTALL);
        Matcher matcher = pattern.matcher(content);
        if (matcher.find()) {
            // 提取分组1的内容（标签内文本）并去除首尾空格
            return matcher.group(1).trim();
        }
        return "";
    }

    /**
     * 移除  标签及内部的思维链内容
     *
     * @param content 原始文本
     * @return 移除思维链后的文本，空值返回空字符串
     */
    private static String cleanThinkChainContent(String content) {
        if (!StringUtils.hasText(content)) {
            return "";
        }
        Pattern pattern = Pattern.compile(PATTERN_THINK_CHAIN, Pattern.DOTALL);
        // 替换think标签及内容为空，再去除首尾空格
        return pattern.matcher(content).replaceAll("").trim();
    }

    /**
     * 格式化文本：清理多余换行、空格，移除末尾问号
     *
     * @param content 需要格式化的文本
     * @return 格式化后的文本，空值返回空字符串
     */
    private static String formatText(String content) {
        if (!StringUtils.hasText(content)) {
            return "";
        }
        // 多个换行符替换为单个空格
        String formatted = content.replaceAll(PATTERN_MULTI_NEWLINE, " ");
        //多个空白字符替换为单个空格
        formatted = formatted.replaceAll(PATTERN_MULTI_SPACE, " ");
        //移除末尾的问号
        formatted = formatted.replaceAll(PATTERN_TRAILING_QUESTION, "");
        //最终再trim一次，确保无首尾空格
        return formatted.trim();
    }
}