package com.qingyun.service.utils;

import java.util.regex.*;
import java.util.*;

public class MarkdownUtils {

    /**
     * 从 Markdown 文本中提取所有用 ```json 包裹的内容；
     * 如果整段文本没有代码块包裹，则直接将其视为一段 JSON 返回。
     *
     * @param markdown Markdown 格式文本或裸 JSON 字符串
     * @return 提取到的所有 JSON 字符串列表（至少包含一项）
     */
    public static List<String> extractJsonBlocks(String markdown) {
        List<String> result = new ArrayList<>();

        // 1. 快速判断是否存在 ```json 代码块包裹
        String trimmed = markdown.trim();
        boolean hasJsonBlock = trimmed.contains("```json");

        if (!hasJsonBlock) {
            // 2. 没有代码块，直接把整个文本当作一份 JSON
            result.add(trimmed);
            return result;
        }

        // 3. 存在代码块，使用正则提取
        String regex = "```json\\s*([\\s\\S]*?)\\s*```";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(trimmed);

        while (matcher.find()) {
            String jsonContent = matcher.group(1).trim();
            if (!jsonContent.isEmpty()) {
                result.add(jsonContent);
            }
        }

        // 4. 极端场景：文本里有 ```json 却匹配不到任何内容，返回空列表
        return result;
    }

    /**
     * 通用版本：支持指定语言标识（如 json、java、python 等）
     *
     * @param markdown Markdown 格式文本
     * @param language 指定语言标识，如 "json"
     * @return 提取到的代码块内容列表
     */
    public static List<String> extractCodeBlocksByLanguage(String markdown, String language) {
        List<String> result = new ArrayList<>();

        String regex = String.format("```%s\\s*([\\s\\S]*?)\\s*```", Pattern.quote(language));
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(markdown);

        while (matcher.find()) {
            String codeContent = matcher.group(1).trim();
            result.add(codeContent);
        }

        return result;
    }

    /**
     * 提取所有形式的代码块（不限制语言类型）
     *
     * @param markdown Markdown 格式文本
     * @return 所有代码块内容列表
     */
    public static List<String> extractAllCodeBlocks(String markdown) {
        List<String> result = new ArrayList<>();

        String regex = "```[a-zA-Z]*\\s*([\\s\\S]*?)\\s*```";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(markdown);

        while (matcher.find()) {
            String codeContent = matcher.group(1).trim();
            result.add(codeContent);
        }

        return result;
    }
}
