/**
 * 飞书流式渲染器 — 从 bridge-manager 飞书分支迁入（C-2）。
 *
 * 🔥地雷1：永远由 feishu adapter 创建（不降级为 EditDraftRenderer）。内部读 cardConfig 分支：
 *   streaming / replyMode==='streaming' → CardKit 卡片；否则 → placeholder 文本 + draftMessageId。
 * （飞书非 streaming 发的是 placeholder '⏳ 正在处理...'，不是 EditDraftRenderer 的空 typing indicator。）
 *
 * 对应原 bridge 行：
 *   onTyping  = 561-591（含降级）；onReasoning/tool = 597-607；onDraft = 610-620 + 650；
 *   onFinal   = 676-688 + 715-744；abort = 828-836；destroy = 856-860。
 *   delivered = !!controller?.cardMessageId || !!draftMessageId（行 776）。
 */

import { StreamingCardController } from './streaming-card-controller'
import { getFeishuCardConfig } from './card-config'
import type { FeishuAdapter } from './adapter'
import type { ToolUseStartInfo, ToolUseEndInfo } from '../../types'
import type { StreamRenderer, StreamRenderContext } from '../stream-renderer'

export class FeishuStreamRenderer implements StreamRenderer {
  private controller: StreamingCardController | null = null
  private draftMessageId?: string

  constructor(private readonly ctx: StreamRenderContext) {}

  get delivered(): boolean {
    return !!this.controller?.cardMessageId || !!this.draftMessageId
  }

  async onTyping(): Promise<void> {
    const config = getFeishuCardConfig(this.ctx.channelId)
    const adapter = this.ctx.adapter as FeishuAdapter
    if (config.replyMode === 'auto' || config.replyMode === 'streaming') {
      // 行 565-584：CardKit 流式卡片
      const controller = new StreamingCardController({ adapter, chatId: this.ctx.chatId, footer: config.footer })
      this.controller = controller
      try {
        await controller.onTyping()
        console.log(`[FeishuStreamRenderer] streaming card created: phase=${controller.currentPhase}`)
      } catch (err) {
        console.warn('[FeishuStreamRenderer] streaming card creation failed:', err instanceof Error ? err.message : err)
        this.controller = null
        // 行 578-583：降级到 placeholder 文本
        const placeholderId = await this.ctx.delivery.deliver(adapter, this.ctx.chatId, '⏳ 正在处理...', { skipDedup: true })
        if (placeholderId) this.draftMessageId = placeholderId
      }
    } else {
      // 行 585-590：非 streaming 发 placeholder
      const placeholderId = await this.ctx.delivery.deliver(adapter, this.ctx.chatId, '⏳ 正在处理...', { skipDedup: true })
      if (placeholderId) this.draftMessageId = placeholderId
    }
  }

  async onReasoning(text: string): Promise<void> {
    if (!this.controller) return
    try { await this.controller.onReasoning(text) } catch (err) { console.warn('[FeishuStreamRenderer] onReasoning failed:', err instanceof Error ? err.message : err) }
  }

  async onToolUseStart(tool: ToolUseStartInfo): Promise<void> {
    if (!this.controller) return
    try { await this.controller.onToolUseStart(tool) } catch (err) { console.warn('[FeishuStreamRenderer] onToolUseStart failed:', err instanceof Error ? err.message : err) }
  }

  async onToolUseEnd(tool: ToolUseEndInfo): Promise<void> {
    if (!this.controller) return
    try { await this.controller.onToolUseEnd(tool) } catch (err) { console.warn('[FeishuStreamRenderer] onToolUseEnd failed:', err instanceof Error ? err.message : err) }
  }

  async onDraft(partialText: string): Promise<void> {
    // 行 610-620（streaming，controller 存在）/ 行 650（非 streaming early return）
    if (this.controller) {
      try { await this.controller.onDraft(partialText) } catch (err) { console.warn('[FeishuStreamRenderer] card stream update failed:', err instanceof Error ? err.message : err) }
    }
    // 非 streaming（controller 为 null）：跳过 draft（镜像行 650 feishu early return）
  }

  async onFinal(text: string): Promise<void> {
    // 行 676-688：CardKit finalize
    if (this.controller) {
      try { await this.controller.onFinal(text) } catch (err) { console.warn('[FeishuStreamRenderer] card finalization failed:', err instanceof Error ? err.message : err) }
      const hadCardMessageId = !!this.controller.cardMessageId
      this.controller = null
      if (hadCardMessageId) return  // 行 684-686：卡片成功，跳过文本投递
      // 卡片失败 → fall through 到文本投递
    }
    // 行 715-744：文本投递（draftMsgId edit / else deliverPlatformFinal）
    const adapter = this.ctx.adapter as FeishuAdapter
    if (this.draftMessageId) {
      const editResult = await this.ctx.delivery.deliver(adapter, this.ctx.chatId, text, { editMessageId: this.draftMessageId })
      if (editResult && editResult !== this.draftMessageId) {
        await this.ctx.delivery.deliver(adapter, this.ctx.chatId, '', { deleteMessageId: this.draftMessageId })
      }
    } else {
      await this.ctx.deliverPlatformFinal(text)
    }
  }

  async abort(_reason: 'abort' | 'error', _errorMsg: string): Promise<void> {
    // 行 828-836：CardKit abortCard
    if (this.controller) {
      try { await this.controller.abortCard() } catch (err) { console.warn('[FeishuStreamRenderer] card abort failed:', err instanceof Error ? err.message : err) }
      this.controller = null
    }
    // 修复问题1：删 placeholder draftMessageId（复刻原 bridge catch 行 791-796 + EditDraftRenderer.abort）。
    // 否则飞书非 streaming / CardKit 降级后 agent 报错会残留 "⏳ 正在处理..." 占位。
    if (this.draftMessageId) {
      try {
        await this.ctx.delivery.deliver(this.ctx.adapter, this.ctx.chatId, '', { deleteMessageId: this.draftMessageId })
      } catch (err) { console.warn('[FeishuStreamRenderer] draft cleanup failed:', err instanceof Error ? err.message : err) }
      this.draftMessageId = undefined
    }
  }

  destroy(): void {
    // 行 856-860
    if (this.controller) {
      this.controller.destroy()
      this.controller = null
    }
  }
}
