/**
 * 查找匹配的闭合标记
 *
 * 用于流式解析代码块（特别是 Mermaid 代码块）时，判断代码块是否完整。
 * 通过查找匹配的闭合标记来确定代码块是否已经完成输入。
 *
 * @param src - 源字符串
 * @param startIdx - 开始搜索的索引位置
 * @param open - 开始标记（如 "```", "$$", "(" 等）
 * @param close - 结束标记（如 "```", "$$", ")" 等）
 * @returns 匹配的闭合标记的索引位置，如果未找到则返回 -1
 *
 * @example
 * ```typescript
 * // 查找代码块的闭合标记
 * const code = "```javascript\nconsole.log('hello');\n```";
 * const closeIdx = findMatchingClose(code, 0, "```", "```");
 * // 返回: 42 (第二个 ``` 的位置)
 *
 * // 查找数学公式的闭合标记
 * const math = "$$\\sum_{i=1}^{n} x_i$$";
 * const closeIdx = findMatchingClose(math, 0, "$$", "$$");
 * // 返回: 最后一个 $ 的位置
 * ```
 */ export function findMatchingClose(src, startIdx, open, close) {
    var len = src.length;
    // 特殊处理 $$ 因为它是两个字符的分隔符，不应该被解释为嵌套的括号
    if (open === '$$' && close === '$$') {
        var i = startIdx;
        while(i < len - 1){
            if (src[i] === '$' && src[i + 1] === '$') {
                // 确保没有被转义
                var k = i - 1;
                var backslashes = 0;
                while(k >= 0 && src[k] === '\\'){
                    backslashes++;
                    k--;
                }
                // 如果反斜杠数量是偶数，说明没有被转义
                if (backslashes % 2 === 0) return i;
            }
            i++;
        }
        return -1;
    }
    var openChar = open[open.length - 1];
    var closeSeq = close;
    var depth = 0;
    var i1 = startIdx;
    while(i1 < len){
        // 如果这里有一个未转义的闭合序列
        if (src.slice(i1, i1 + closeSeq.length) === closeSeq) {
            var k1 = i1 - 1;
            var backslashes1 = 0;
            while(k1 >= 0 && src[k1] === '\\'){
                backslashes1++;
                k1--;
            }
            // 如果反斜杠数量是偶数，说明没有被转义
            if (backslashes1 % 2 === 0) {
                if (depth === 0) return i1;
                depth--;
                i1 += closeSeq.length;
                continue;
            }
        }
        var ch = src[i1];
        // 跳过转义字符
        if (ch === '\\') {
            i1 += 2;
            continue;
        }
        // 如果遇到开始字符，增加深度
        if (ch === openChar) {
            depth++;
        } else if (ch === closeSeq[closeSeq.length - 1]) {
            if (depth > 0) depth--;
        }
        i1++;
    }
    return -1;
}
/**
 * 检查字符串中是否有未闭合的括号
 */ function checkUnclosedBrackets(code) {
    // 检查圆括号
    var openParen = findMatchingClose(code, 0, '(', ')');
    if (openParen === -1 && code.includes('(')) {
        // 有开括号但没有匹配的闭括号
        return true;
    }
    // 检查方括号
    var openBracket = findMatchingClose(code, 0, '[', ']');
    if (openBracket === -1 && code.includes('[')) {
        return true;
    }
    // 检查花括号
    var openBrace = findMatchingClose(code, 0, '{', '}');
    if (openBrace === -1 && code.includes('{')) {
        return true;
    }
    return false;
}
var MERMAID_DIAGRAM_KEYWORDS = [
    'graph',
    'flowchart',
    'sequenceDiagram',
    'gantt',
    'pie',
    'classDiagram',
    'stateDiagram',
    'erDiagram',
    'journey',
    'gitgraph',
    'xychart-beta',
    'mindmap',
    'timeline',
    'quadrantChart',
    'sankey-beta',
    'block-beta',
    'packet-beta',
    'kanban',
    'architecture-beta',
    'requirementDiagram',
    'zenuml',
    'C4Context',
    'C4Container',
    'C4Component',
    'C4Deployment'
];
var MERMAID_INCOMPLETE_TAIL = [
    /graph\s*$/i,
    /-->?\s*$/
];
function isMermaidCodeComplete(code) {
    if (!MERMAID_DIAGRAM_KEYWORDS.some(function(kw) {
        return code.includes(kw);
    })) return false;
    if (code.length < 10) return false;
    if (checkUnclosedBrackets(code)) return false;
    return !MERMAID_INCOMPLETE_TAIL.some(function(re) {
        return re.test(code);
    });
}
/**
 * 检查代码块是否完整（基于代码内容）
 * 用于流式输入时判断代码块是否已经完成
 *
 * @param code - 代码内容
 * @param language - 代码语言（如 'mermaid', 'javascript' 等）
 * @returns 是否可能完整
 */ export function isCodeBlockLikelyComplete(code, language) {
    var trimmed = code.trim();
    if (!trimmed) return false;
    // 对于 Mermaid，使用更严格的检查
    if (language === 'mermaid') {
        return isMermaidCodeComplete(trimmed);
    }
    // 对于其他语言，检查基本的完整性
    // 如果代码很短，可能是正在输入中
    if (trimmed.length < 5) return false;
    // 检查是否以常见的不完整模式结尾
    var incompletePatterns = [
        /\\$/,
        /\/\*[\s\S]*$/,
        /\/\/.*$/,
        /['"`][^'"`]*$/
    ];
    // 检查括号匹配
    var hasUnclosedBrackets = checkUnclosedBrackets(trimmed);
    if (hasUnclosedBrackets) return false;
    // 如果匹配不完整模式，可能还在输入中
    var endsWithIncomplete = incompletePatterns.some(function(pattern) {
        return pattern.test(trimmed);
    });
    return !endsWithIncomplete;
}
export default findMatchingClose;
