import katex from 'katex';

// 简单的数学公式渲染器
export const renderMathFormulas = (content: string): string => {
  console.log('开始处理数学公式，内容长度:', content.length);

  // 渲染块级数学公式 $$...$$ 和 \[...\]（支持多行）
  content = content.replace(/\$\$([\s\S]*?)\$\$/g, (match, formula) => {
    console.log('发现$$块级公式:', formula.trim());
    try {
      const rendered = katex.renderToString(formula.trim(), {
        displayMode: true,
        throwOnError: false
      });
      console.log('$$块级公式渲染成功');
      return `<div class="math-display">${rendered}</div>`;
    } catch (error) {
      console.error('KaTeX $$块级公式渲染错误:', error, '公式内容:', formula);
      return `<div class="math-error">数学公式渲染错误: ${formula.trim()}</div>`;
    }
  });

  // 渲染 \[...\] 块级数学公式
  content = content.replace(/\\\[([\s\S]*?)\\\]/g, (match, formula) => {
    console.log('发现\\[\\]块级公式:', formula.trim());
    try {
      const rendered = katex.renderToString(formula.trim(), {
        displayMode: true,
        throwOnError: false
      });
      console.log('\\[\\]块级公式渲染成功');
      return `<div class="math-display">${rendered}</div>`;
    } catch (error) {
      console.error('KaTeX \\[\\]块级公式渲染错误:', error, '公式内容:', formula);
      return `<div class="math-error">数学公式渲染错误: ${formula.trim()}</div>`;
    }
  });

  // 渲染行内数学公式 $...$
  content = content.replace(/\$([^$]+?)\$/g, (match, formula) => {
    console.log('发现$行内公式:', formula.trim());
    try {
      const rendered = katex.renderToString(formula.trim(), {
        displayMode: false,
        throwOnError: false
      });
      console.log('$行内公式渲染成功');
      return rendered;
    } catch (error) {
      console.error('KaTeX $行内公式渲染错误:', error, '公式内容:', formula);
      return `<span class="math-error">公式错误: ${formula.trim()}</span>`;
    }
  });

  // 渲染 \(...\) 行内数学公式
  content = content.replace(/\\\((.*?)\\\)/g, (match, formula) => {
    console.log('发现\\(\\)行内公式:', formula.trim());
    try {
      const rendered = katex.renderToString(formula.trim(), {
        displayMode: false,
        throwOnError: false
      });
      console.log('\\(\\)行内公式渲染成功');
      return rendered;
    } catch (error) {
      console.error('KaTeX \\(\\)行内公式渲染错误:', error, '公式内容:', formula);
      return `<span class="math-error">公式错误: ${formula.trim()}</span>`;
    }
  });

  return content;
};

// 处理 markdown + 数学公式
export const renderMarkdownWithMath = (content: string): string => {
  console.log('原始内容:', content);

  // 首先处理数学公式
  const withMath = renderMathFormulas(content);
  console.log('处理数学公式后:', withMath);

  // 简单的 markdown 处理，但保持数学公式完整
  let processed = withMath;

  // 处理标题（只在行首）
  processed = processed.replace(/^### (.*)$/gm, '<h3>$1</h3>');
  processed = processed.replace(/^## (.*)$/gm, '<h2>$1</h2>');
  processed = processed.replace(/^# (.*)$/gm, '<h1>$1</h1>');

  // 处理粗体
  processed = processed.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');

  // 处理有序列表
  processed = processed.replace(/^\d+\.\s+(.*)$/gm, '<li>$1</li>');

  // 处理无序列表
  processed = processed.replace(/^[-*]\s+(.*)$/gm, '<li>$1</li>');

  // 将连续的 li 标签包装在 ol 或 ul 中
  processed = processed.replace(/(<li>.*?<\/li>(?:\s*<li>.*?<\/li>)*)/gs, '<ul>$1</ul>');

  // 处理段落（双换行表示段落分隔）
  const paragraphs = processed.split(/\n\s*\n/);
  processed = paragraphs.map(paragraph => {
    const trimmed = paragraph.trim();
    if (!trimmed) return '';

    // 如果已经是HTML标签，不要包装
    if (trimmed.startsWith('<')) {
      return trimmed;
    }

    // 处理单行换行
    const withBreaks = trimmed.replace(/\n/g, '<br>');
    return `<p>${withBreaks}</p>`;
  }).join('\n');

  console.log('最终处理结果:', processed);
  return processed;
};
