/**
 * 解析文本中的括号内容，将括号内的文本标记为灰色
 * 支持中文括号（（）） 和英文括号（()）
 */

export interface TextPart {
  text: string
  isInBrackets: boolean
}

export function parseTextWithBrackets(originText: string): TextPart[] {
  if (!originText) return []

  const text = originText.replace(/\*/gi, '')

  const parts: TextPart[] = []
  let currentIndex = 0

  // 匹配中文括号（）或英文括号()的正则表达式
  const bracketRegex = /[（(][^）)]*[）)]/g
  let match

  while ((match = bracketRegex.exec(text)) !== null) {
    // 添加括号前的普通文本
    if (match.index > currentIndex) {
      const normalText = text.slice(currentIndex, match.index)
      if (normalText) {
        parts.push({ text: normalText, isInBrackets: false })
      }
    }

    // 添加括号内的文本（包含括号）
    parts.push({ text: match[0], isInBrackets: true })

    currentIndex = match.index + match[0].length
  }

  // 添加最后的普通文本
  if (currentIndex < text.length) {
    const remainingText = text.slice(currentIndex)
    if (remainingText) {
      parts.push({ text: remainingText, isInBrackets: false })
    }
  }

  return parts
}

/**
 * 提取文本中非括号内的内容，用于语音合成
 * 会移除中文括号（）、英文括号()内的所有内容，以及emoji表情
 * @param text 原始文本
 * @returns 移除括号内容和emoji后的文本，会自动去除多余空格
 */
export function extractTextForVoice(text: string): string {
  if (!text) return ''

  // 使用正则表达式移除所有括号及其内容
  const bracketRegex = /[（(][^）)]*[）)]/g
  let cleanedText = text.replace(bracketRegex, '')

  // 移除emoji表情
  // 匹配各种unicode emoji范围
  const emojiRegex =
    /[\u{1F600}-\u{1F64F}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F1E0}-\u{1F1FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]|[\u{1F900}-\u{1F9FF}]|[\u{1F018}-\u{1F270}]|[\u{238C}]|[\u{2194}-\u{21AA}]|[\u{23E9}-\u{23F3}]|[\u{25AA}-\u{25FE}]|[\u{2B05}-\u{2B07}]|[\u{2934}-\u{2935}]|[\u{3030}]|[\u{3297}]|[\u{3299}]|[\u{FE0F}]|[\u{200D}]/gu
  cleanedText = cleanedText.replace(emojiRegex, '')

  // 去除多余的空格并返回
  return cleanedText.replace(/\s+/g, ' ').trim()
}

/**
 * 计算文本的预估音频时长
 * @param text 文本内容
 * @param speechRate 语速设置 (-50 到 100，默认为 0)
 * @param baseWordsPerMinute 基础语速（每分钟字数），默认为 200 字/分钟
 * @returns 预估的音频时长（秒）
 */
export function calculateAudioDuration(
  text: string,
  speechRate: number = 0,
  baseWordsPerMinute: number = 200
): number {
  if (!text) return 0

  // 获取有效的语音文本（去除括号和emoji）
  const voiceText = extractTextForVoice(text)
  if (!voiceText) return 0

  // 计算文本长度（中文按字符计算，英文按单词计算）
  const chineseCharCount = (voiceText.match(/[\u4e00-\u9fff]/g) || []).length
  const englishWords = voiceText.replace(/[\u4e00-\u9fff]/g, ' ').match(/\b\w+\b/g) || []
  const englishWordCount = englishWords.length

  // 中文字符数 + 英文单词数作为总字数
  const totalWordCount = chineseCharCount + englishWordCount

  if (totalWordCount === 0) return 0

  // 验证并标准化 speechRate 参数
  const validSpeechRate = typeof speechRate === 'number' && !isNaN(speechRate) ? speechRate : 0
  const clampedSpeechRate = Math.max(-50, Math.min(100, validSpeechRate))

  // 根据语速调整基础语速
  // speechRate 范围 -50 到 100，映射到 0.5倍 到 2倍速度
  // speechRate = 0 时为正常速度，speechRate = 100 时为 2倍速，speechRate = -50 时为 0.5倍速
  const speedMultiplier = 1 + clampedSpeechRate / 150 // 将 -50~100 转换为 0.5~1.5 的乘数
  const adjustedWordsPerMinute = baseWordsPerMinute * speedMultiplier

  // 计算时长（分钟），然后转换为秒
  const durationInMinutes = totalWordCount / adjustedWordsPerMinute
  const durationInSeconds = durationInMinutes * 60

  // 至少返回 0.5 秒，避免过短的时长
  return Math.max(0.5, durationInSeconds)
}

/**
 * 格式化音频时长显示
 * @param durationInSeconds 时长（秒）
 * @returns 格式化的时长字符串，如 "2''" 或 "1'23''"
 */
export function formatAudioDuration(durationInSeconds: number): string {
  // 验证输入参数，防止 NaN 或无效值
  if (typeof durationInSeconds !== 'number' || isNaN(durationInSeconds) || durationInSeconds < 1) {
    return "1''"
  }

  const totalSeconds = Math.round(durationInSeconds)

  if (totalSeconds < 60) {
    return `${totalSeconds}''`
  }

  const minutes = Math.floor(totalSeconds / 60)
  const seconds = totalSeconds % 60

  if (seconds === 0) {
    return `${minutes}'`
  }

  return `${minutes}'${seconds.toString().padStart(2, '0')}''`
}
