/**
 * 富文本处理工具函数
 */

/**
 * 检测内容是否为富文本（HTML）
 * @param {string} content - 要检测的内容
 * @returns {boolean} - 是否为富文本
 */
export const isRichText = (content) => {
  if (!content || typeof content !== 'string') {
    return false
  }
  
  // 检测是否包含HTML标签
  const htmlTagRegex = /<[^>]+>/
  return htmlTagRegex.test(content)
}

/**
 * 清理富文本内容，移除危险的标签和属性
 * @param {string} content - 富文本内容
 * @returns {string} - 清理后的内容
 */
export const sanitizeRichText = (content) => {
  if (!content || typeof content !== 'string') {
    return ''
  }
  
  // 如果不是富文本，直接返回
  if (!isRichText(content)) {
    return content
  }
  
  // 创建一个临时DOM元素来解析HTML
  const tempDiv = document.createElement('div')
  tempDiv.innerHTML = content
  
  // 移除危险的标签
  const dangerousTags = ['script', 'iframe', 'object', 'embed', 'form', 'input', 'button']
  dangerousTags.forEach(tag => {
    const elements = tempDiv.querySelectorAll(tag)
    elements.forEach(el => el.remove())
  })
  
  // 移除危险的属性
  const dangerousAttrs = ['onclick', 'onload', 'onerror', 'onmouseover', 'onfocus', 'onblur']
  const allElements = tempDiv.querySelectorAll('*')
  allElements.forEach(el => {
    dangerousAttrs.forEach(attr => {
      if (el.hasAttribute(attr)) {
        el.removeAttribute(attr)
      }
    })
    
    // 移除javascript:协议的链接
    if (el.hasAttribute('href') && el.getAttribute('href').startsWith('javascript:')) {
      el.removeAttribute('href')
    }
    
    if (el.hasAttribute('src') && el.getAttribute('src').startsWith('javascript:')) {
      el.removeAttribute('src')
    }
  })
  
  return tempDiv.innerHTML
}

/**
 * 将普通文本转换为HTML格式（保持换行）
 * @param {string} text - 普通文本
 * @returns {string} - HTML格式的文本
 */
export const textToHtml = (text) => {
  if (!text || typeof text !== 'string') {
    return ''
  }
  
  // 如果已经是富文本，直接返回清理后的内容
  if (isRichText(text)) {
    return sanitizeRichText(text)
  }
  
  // 将普通文本转换为HTML，保持换行
  return text
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
    .replace(/\n/g, '<br>')
}

/**
 * 获取富文本的纯文本内容（用于摘要等）
 * @param {string} content - 富文本内容
 * @param {number} maxLength - 最大长度
 * @returns {string} - 纯文本内容
 */
export const getPlainText = (content, maxLength = 200) => {
  if (!content || typeof content !== 'string') {
    return ''
  }
  
  let plainText = content
  
  // 如果是富文本，提取纯文本
  if (isRichText(content)) {
    const tempDiv = document.createElement('div')
    tempDiv.innerHTML = content
    plainText = tempDiv.textContent || tempDiv.innerText || ''
  }
  
  // 清理多余的空白字符
  plainText = plainText.replace(/\s+/g, ' ').trim()
  
  // 截取指定长度
  if (maxLength && plainText.length > maxLength) {
    plainText = plainText.substring(0, maxLength) + '...'
  }
  
  return plainText
}

/**
 * 为富文本内容添加样式类
 * @param {string} content - 富文本内容
 * @returns {string} - 添加样式类后的内容
 */
export const addRichTextStyles = (content) => {
  if (!content || typeof content !== 'string') {
    return ''
  }
  
  // 如果不是富文本，转换为HTML
  if (!isRichText(content)) {
    return textToHtml(content)
  }
  
  // 清理内容
  let cleanContent = sanitizeRichText(content)
  
  // 创建临时DOM来处理元素
  const tempDiv = document.createElement('div')
  tempDiv.innerHTML = cleanContent
  
  // 处理图片元素
  const images = tempDiv.querySelectorAll('img')
  images.forEach(img => {
    // 保留原有的class属性，添加新的样式类
    const existingClasses = img.getAttribute('class') || ''
    const newClasses = existingClasses ? `${existingClasses} rich-text-image` : 'rich-text-image'
    img.setAttribute('class', newClasses)
    
    // 确保图片有alt属性
    if (!img.getAttribute('alt')) {
      img.setAttribute('alt', '图片')
    }
    
    // 保留用户设置的style属性，但确保响应式
    const existingStyle = img.getAttribute('style') || ''
    let newStyle = existingStyle
    
    // 如果没有设置max-width，添加响应式约束
    if (!existingStyle.includes('max-width')) {
      newStyle = newStyle ? `${newStyle}; max-width: 100%;` : 'max-width: 100%;'
    }
    
    // 如果没有设置max-height，添加最大高度限制
    if (!existingStyle.includes('max-height')) {
      newStyle = newStyle ? `${newStyle}; max-height: 600px;` : 'max-height: 600px;'
    }
    
    // 如果没有设置height为auto，添加等比缩放
    if (!existingStyle.includes('height') || existingStyle.includes('height: auto')) {
      if (!newStyle.includes('height: auto')) {
        newStyle = newStyle ? `${newStyle}; height: auto;` : 'height: auto;'
      }
    }
    
    img.setAttribute('style', newStyle)
  })
  
  // 处理表格元素
  const tables = tempDiv.querySelectorAll('table')
  tables.forEach(table => {
    const existingClasses = table.getAttribute('class') || ''
    const newClasses = existingClasses ? `${existingClasses} rich-text-table` : 'rich-text-table'
    table.setAttribute('class', newClasses)
  })
  
  // 处理代码块元素
  const preElements = tempDiv.querySelectorAll('pre')
  preElements.forEach(pre => {
    const existingClasses = pre.getAttribute('class') || ''
    const newClasses = existingClasses ? `${existingClasses} rich-text-code` : 'rich-text-code'
    pre.setAttribute('class', newClasses)
  })
  
  // 处理行内代码元素
  const codeElements = tempDiv.querySelectorAll('code:not(pre code)')
  codeElements.forEach(code => {
    const existingClasses = code.getAttribute('class') || ''
    const newClasses = existingClasses ? `${existingClasses} rich-text-inline-code` : 'rich-text-inline-code'
    code.setAttribute('class', newClasses)
  })

  // 替换富文本中黑色字体为白色，以适应深色背景
  const allElements = tempDiv.querySelectorAll('*');
  allElements.forEach(el => {
    const blackColors = [
      'rgb(0,0,0)', 
      'black', 
      '#000000', 
      '#000', 
      'rgba(0,0,0,0.8)', 
      'rgba(0,0,0,0.9)',
      'rgba(0,0,0,0.95)',
      '#333333',
      'rgb(51,51,51)'
    ];
    
    // 处理内联样式
    if (el.style.color && blackColors.includes(el.style.color.toLowerCase().replace(/\s/g, ''))) {
      el.style.color = '#cccccc'; // 替换为主题中的浅灰色
    }

    // 处理 <font> 标签的 color 属性
    if (el.tagName.toLowerCase() === 'font') {
      const colorAttr = el.getAttribute('color');
      if (colorAttr && blackColors.includes(colorAttr.toLowerCase().replace(/\s/g, ''))) {
        el.setAttribute('color', '#cccccc');
      }
    }
  });
  
  return tempDiv.innerHTML
}
