import type { IChatMessage } from '@/api/types'

/**
 * F4-A (Round 4 扩展): card-bearing assistant 类型排除气泡。
 * 这些类型由各自 card 组件自带 chrome (ErrorCard full chrome + 其余 partial chrome)。
 * 注: debate_started 对应 DebateBannerCard (plan 文档误记为 debate_banner)。
 * ce-code-review P2: 加入 'error' — ErrorCard.vue 自带 full chrome，
 *   不排除会导致 assistant 气泡嵌套 ErrorCard chrome 双层背景。
 *
 * 提取为纯函数以支持单元测试 (F4-A 是关键决策)，避免 leaky abstraction
 * (ce-simplify-code P3) — MessageShell 通过函数调用而非暴露 Set。
 */
const CARD_BEARING_TYPES = new Set<string>([
  'board_conclusion',
  'team_plan',
  'debate_started',
  'debate_argument',
  'debate_summary',
  'debate_resolved',
  'collaboration_graph',
  'review_result',
  'risk_flagged',
  'error',
])

export function isCardBearingType(type?: string): boolean {
  return type ? CARD_BEARING_TYPES.has(type) : false
}

/**
 * U3 G1: 检测 assistant 消息内容是否为空 (pre-stream / tool-call-only)。
 * AssistantText 总渲染根 div，:empty 选择器永不匹配，需 JS 判断。
 * isEmpty = 无 content + 无 thinking + 无 tool_calls。
 *
 * 提取为纯函数以支持单元测试 (G1 是 P0 决策)。
 */
export function isAssistantBubbleEmpty(message: IChatMessage): boolean {
  if (message.role !== 'assistant') return false
  return (
    !message.content &&
    !message.thinking &&
    (!message.tool_calls || message.tool_calls.length === 0)
  )
}

/**
 * U4: 判定用户消息是否为普通文本 (非文件附件且非 @board/@team 命令)。
 * 仅普通文本应用深色气泡，command card / file attachment 保持浅色背景。
 *
 * 提取为纯函数以支持单元测试 (U4 是关键功能)。
 */
const FILE_MARKDOWN_RE = /^\[文件\]\s*\[(.+?)\]\((.+?)\)$/s
const COMMAND_RE = /^@(board|team)(?::([^\s]+))?\s+([\s\S]+)$/

export function isPlainUserText(content: string): boolean {
  return !FILE_MARKDOWN_RE.test(content) && !COMMAND_RE.test(content)
}
