import { renderCodeBlockWrapper } from './render-code-block-wrapper.js';
import { escapeHtml } from '../utils/escape-html.js';

/**
 * 解析代码块格式：```language\ncode\n``` 或 ```language\ncode（未闭合），支持前面有空格或tab缩进
 */
function parseCodeBlock(codeBlock) {
  // 首先尝试匹配完整的代码块（有结束标记），支持前面有空格或tab缩进
  const completeMatch = codeBlock.match(/^[ \t]*```([^\n]*)\n([\s\S]*?)\n?[ \t]*```$/m);
  if (completeMatch) {
    return {
      language: completeMatch[1]?.trim() || 'plaintext',
      code: completeMatch[2] || '',
      isValid: true
    };
  }

  // 然后尝试匹配未闭合的代码块（没有结束标记），支持前面有空格或tab缩进
  const unclosedMatch = codeBlock.match(/^[ \t]*```([^\n]*)\n([\s\S]+)$/m);
  if (unclosedMatch) {
    const code = unclosedMatch[2] || '';
    // 确保代码内容不以```结尾（避免误匹配部分完整代码块）
    if (!code.trim().endsWith('```')) {
      return {
        language: unclosedMatch[1]?.trim() || 'plaintext',
        code: code,
        isValid: true
      };
    }
  }

  // 都不匹配，返回无效结果
  return {
    language: 'plaintext',
    code: codeBlock,
    isValid: false
  };
}

/**
 * 渲染代码块为HTML
 */
function renderCodeBlockToHtml(codeBlock) {
  const {
    language,
    code,
    isValid
  } = parseCodeBlock(codeBlock);
  if (!isValid) {
    // 如果不匹配标准格式，返回简单的 pre 包装
    return `<pre><code>${escapeHtml(codeBlock)}</code></pre>`;
  }

  // 渲染完整的代码块包装器
  return renderCodeBlockWrapper(code, language);
}

export { renderCodeBlockToHtml };
