/**
 * Markdown 渲染工具
 * 使用 marked 解析 + DOMPurify 消毒，支持 GFM（GitHub Flavored Markdown）
 */
import { marked } from 'marked'
import DOMPurify from 'dompurify'

// 配置 marked
marked.setOptions({
  gfm: true,          // 启用 GFM（表格、任务列表、删除线等）
  breaks: true,       // 换行符转为 <br>
})

/**
 * 渲染 Markdown 为安全的 HTML
 * @param text Markdown 文本
 * @returns 安全的 HTML 字符串
 */
export function renderMarkdown(text: string): string {
  if (!text) return ''

  // 1. 使用 marked 解析 Markdown
  const rawHtml = marked.parse(text) as string

  // 2. 使用 DOMPurify 消毒，防止 XSS
  const cleanHtml = DOMPurify.sanitize(rawHtml, {
    // 允许的标签（覆盖默认，增加一些 Markdown 常用标签）
    ALLOWED_TAGS: [
      'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
      'p', 'br', 'hr',
      'strong', 'em', 'b', 'i', 'u', 's', 'del', 'ins',
      'ul', 'ol', 'li',
      'blockquote', 'pre', 'code',
      'a', 'img',
      'table', 'thead', 'tbody', 'tr', 'th', 'td',
      'span', 'div',
    ],
    // 允许的属性
    ALLOWED_ATTR: [
      'href', 'title', 'target', 'rel',          // 链接
      'src', 'alt', 'width', 'height',           // 图片
      'class',                                   // 代码高亮类
    ],
    // 链接强制添加 rel="noopener noreferrer"
    ADD_ATTR: ['target'],
    FORCE_BODY: true,
  })

  return cleanHtml
}

/**
 * 渲染 Markdown 为纯文本（用于摘要/预览）
 * @param text Markdown 文本
 * @param maxLength 最大长度（默认 200）
 * @returns 纯文本摘要
 */
export function renderMarkdownPlain(text: string, maxLength: number = 200): string {
  if (!text) return ''

  // 移除 Markdown 语法，保留纯文本
  let plain = text
    .replace(/#{1,6}\s+/g, '')        // 移除标题标记
    .replace(/\*\*(.+?)\*\*/g, '$1')  // 移除加粗
    .replace(/\*(.+?)\*/g, '$1')      // 移除斜体
    .replace(/`(.+?)`/g, '$1')        // 移除行内代码
    .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')  // 移除链接，保留文字
    .replace(/^[-*+]\s+/gm, '')       // 移除无序列表标记
    .replace(/^\d+\.\s+/gm, '')       // 移除有序列表标记
    .replace(/>\s+/g, '')             // 移除引用标记
    .replace(/\n+/g, ' ')             // 换行转空格
    .trim()

  // 截断
  if (plain.length > maxLength) {
    plain = plain.slice(0, maxLength) + '...'
  }

  return plain
}
