package org.jk.rag.utils;

import org.jk.rag.domain.dto.JkSliceImage;
import org.jk.rag.domain.entity.JkMediaReplacement;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 解析文本中【示意图序号_XXXXX】格式内容的工具类
 */
@Slf4j
public class SchematicNumberParser {

    // 定义匹配【示意图序号_XXXXX】格式的正则表达式
    // 说明：【】为中文全角括号，\\d+匹配1个及以上数字，()表示捕获组（提取序号）
    private static final String REGEX_PATTERN = "【示意图序号_([a-zA-Z0-9_]+)】";

    /**
     * 核心方法：从输入文本中提取所有【示意图序号_XXXXX】格式的序号
     * @param inputText 待解析的原始文本
     * @return 提取到的序号列表（若无匹配则返回空列表）
     */
    public static List<String> extractSchematicNumbers(String inputText) {
        // 1. 校验输入文本（避免空指针）
        if (inputText == null || inputText.trim().isEmpty()) {
            System.out.println("警告：输入文本为空，无法解析！");
            return new ArrayList<>();
        }

        // 2. 编译正则表达式（Pattern为线程安全类，可复用）
        Pattern pattern = Pattern.compile(REGEX_PATTERN);
        // 3. 创建匹配器，关联输入文本
        Matcher matcher = pattern.matcher(inputText);

        // 4. 遍历所有匹配结果，提取序号
        List<String> schematicNumbers = new ArrayList<>();
        while (matcher.find()) {
            // matcher.group(1)：获取第1个捕获组（即括号内的数字序号）
            String number = matcher.group(1);
            String text = matcher.group(0);
            schematicNumbers.add(text);
            // 可选：打印匹配过程（便于调试）
//            System.out.printf("已匹配到示意图序号：%s（完整格式：%s）%n",
//                    number, matcher.group(0)); // group(0)为完整匹配的字符串
        }

        // 5. 处理无匹配的情况
        if (schematicNumbers.isEmpty()) {
            System.out.println("提示：未在文本中找到【示意图序号_XXXXX】格式的内容！");
        }

        return schematicNumbers;
    }

    /**
     * 将文本中的示意图序号替换为图片超链接
     * @param inputText 原始文本
     * @return 替换后的文本，其中示意图序号被替换为超链接
     */
    public static String replaceWithImageLinks(String inputText,List<JkMediaReplacement> imageList) {
        if (inputText == null || inputText.trim().isEmpty() || imageList == null || imageList.isEmpty()) {
            return inputText;
        }

        Pattern pattern = Pattern.compile(REGEX_PATTERN);
        Matcher matcher = pattern.matcher(inputText);

        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            String fullNumber = matcher.group(0);
            String imageUrl = imageList.stream()
                    // 过滤掉null元素和originText为null的元素
                    .filter(media -> media != null && media.getOriginText() != null)
                    // 匹配originText与示意图序号
                    .filter(media -> media.getOriginText().equals(fullNumber))
                    // 提取mediaUrl
                    .map(JkMediaReplacement::getMediaUrl)
                    // 获取第一个匹配项，如果没有则返回空Optional
                    .findFirst()
                    // 如果找到则返回，否则返回null并打印警告
                    .orElseGet(() -> {
                        return null;
                    });

            // 如果找到图片链接，替换为超链接格式；否则保留原始文本
            if (imageUrl != null) {
                if(imageUrl.contains("https://10.1.28.14:9000")){
                    imageUrl = imageUrl.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
                }
                // 构建HTML超链接，可根据需要调整格式
                String link = String.format("<a href=\"%s\" target=\"_blank\">%s</a>", imageUrl, fullNumber);
                matcher.appendReplacement(result, link);
            } else {
                // 未找到图片链接，保留原始内容
                matcher.appendReplacement(result, fullNumber);
                System.out.println("警告：未找到序号 " + fullNumber + " 对应的图片链接");
            }
        }

        matcher.appendTail(result);
        return result.toString();
    }

    /**
     * 提取文本中的示意图序号与对应图片URL的映射关系
     * @param inputText 原始文本
     * @param imageList 图片替换信息列表
     * @return 包含示意图序号与图片URL映射关系的List<Map>
     */
    public static List<JkSliceImage> extractImageUrlMappings(String inputText, List<JkMediaReplacement> imageList) {
        List<JkSliceImage> resultList = new ArrayList<>();

        if (inputText == null || inputText.trim().isEmpty() || imageList == null || imageList.isEmpty()) {
            return resultList;
        }

        Pattern pattern = Pattern.compile(REGEX_PATTERN);
        Matcher matcher = pattern.matcher(inputText);

        while (matcher.find()) {
            String fullNumber = matcher.group(0);
            String imageUrl = imageList.stream()
                    // 过滤掉null元素和originText为null的元素
                    .filter(media -> media != null && media.getOriginText() != null)
                    // 匹配originText与示意图序号
                    .filter(media -> media.getOriginText().equals(fullNumber))
                    // 提取mediaUrl
                    .map(JkMediaReplacement::getMediaUrl)
                    // 获取第一个匹配项，如果没有则返回空Optional
                    .findFirst()
                    // 如果找到则返回，否则返回null
                    .orElse(null);

            // 处理URL替换
            if (imageUrl != null && imageUrl.contains("https://10.1.28.14:9000")) {
                imageUrl = imageUrl.replace("https://10.1.28.14:9000", "https://minio.jkec.info:9000");
            }

            // 创建映射并添加到结果列表
            JkSliceImage sliceImage = JkSliceImage.builder().name(fullNumber).url(imageUrl).build();
            resultList.add(sliceImage);

            // 对于没有找到对应URL的情况打印警告
            if (imageUrl == null) {
                System.out.println("警告：未找到序号 " + fullNumber + " 对应的图片链接");
            }
        }

        return resultList;
    }

    // 测试方法：验证解析逻辑
    public static void main(String[] args) {
        // 示例输入文本（与题目中的文本一致）
        String sampleText = "步骤详述: \n" +
                "1）选择模型。点击【请选择需要浏览的模型文件】按钮，选择需要加载的模型（支持选多个模型文件）；【示意图序号_a2942670488668995584_22】\n" +
                "2）选任务类型。选择需要查看的任务类型，点击【查询】按钮；\n" +
                "3）选任务状态。选择需要查看的任务状态，点击【查询】按钮；\n" +
                "4）通过模型查看报表。选中构件颜色为绿色的模型构件，点击鼠标右键弹出面板，点击【查看构件详情】。【示意图序号_a2942670488668995584_23】【示意图序号_a2942670488668995584_24】";

        // 调用解析方法
        List<String> result = extractSchematicNumbers(sampleText);

        // 输出最终结果
        System.out.println("\n========== 解析结果 ==========");
        if (!result.isEmpty()) {
            System.out.printf("共提取到 %d 个示意图序号：%n", result.size());
            for (int i = 0; i < result.size(); i++) {
                System.out.printf("%d. %s%n", i + 1, result.get(i));
            }
        }
    }
}
