//! 工具审批 — approveToolCall(单条) + batchApprove(批量遍历)
//!
//! 原 useAiSend.ts 拆分(fe-arch P0-1):审批链与发送/队列链职责分离。
//! 审批不调发送核心,仅依赖 aiShared(findToolCall)/aiApi.approve/state,
//! 是 useAiSend 三条链中最独立的闭包,故抽出独立模块。
//!
//! 耦合:
//! - findToolCall 来自 aiShared(原 useAiEvents↔useAiSend 循环依赖已由 aiShared 打破)
//! - resetStreamWatchdog/clearStreamWatchdog 来自 useAiStream(审批执行→续生成窗口覆盖)
//! - state.queue 清空:IPC 失败即对话结束(B-32 防生成中入队消息静默丢失)
//!
//! 模块级私有:
//! - _pendingApprovalIds:审批按钮防抖守卫(同 useAiSend 原实现)

import { aiApi } from '@/api'
import { state } from '@/stores/ai'
import { t } from '@/i18n/i18n-helpers'
import { resetStreamWatchdog, clearStreamWatchdog } from './useAiStream'
import { findToolCall } from './aiShared'

/**
 * F-260616-06: 审批按钮防抖守卫——同一 id 短期多次点击只发一次 IPC。
 * IPC 往返 <100ms，300ms 窗口足够覆盖竞态。
 */
const _pendingApprovalIds = new Set<string>()

/** 工具审批:保持 pending_approval 让审批卡片可见(按钮 loading 由 ToolCard 本地 ref 持有),
 *  IPC 失败时改 completed+错误文案。后端回事件后由 useAiEvents 转 completed/rejected。
 *  B-260616-08:不再乐观置 running——原写法让 .ai-tool-approval 整块消失(切骨架屏),
 *  按钮无 loading 中间态、用户无重审入口;loading 现下沉到 ToolCard 局部 ref,语义正确。 */
async function approveToolCall(toolCallId: string, approved: boolean) {
  // F-260616-06: 防抖——同一 id 仍在处理中则跳过（竞态点击/网络慢重试）
  if (_pendingApprovalIds.has(toolCallId)) return
  _pendingApprovalIds.add(toolCallId)
  try {
    // 复用 findToolCall(反向扫描)避免重复实现查找逻辑;仅缓存引用用于 IPC 失败回滚
    const tc = findToolCall(toolCallId)
  // 重启看门狗覆盖审批执行→续生成窗口(useAiEvents.ts:162 AiApprovalRequired 已 clear,
  // 审批态无心跳兜底;approve 后后端要跑工具+续生成,期间任何后端异常不回则按钮永久 loading。
  // 复用通用 watchdog 而非加审批专用超时:复用同一收尾路径(onStreamTimeout 兜底复位 streaming),
  // 避免新增独立计时器与状态分支)
  resetStreamWatchdog()
  try {
    await aiApi.approve(toolCallId, approved)
  } catch (e) {
    // IPC 未送达:用户已点过按钮,清看门狗(避免 130s 后误触发假错误)再回滚到失败态
    clearStreamWatchdog()
    state.queue = [] // B-32:IPC 失败即对话结束,清队列防生成中入队消息静默丢失
    // 仅 IPC 真失败(审批已处理/网络断)走到这里：后端工具失败已改走 emit completed，不进此分支
    // 不回滚 pending_approval(会卡死按钮)，改设 completed + 错误提示，让用户知晓失败
    console.error('[AI] 审批操作未送达后端:', e)
    if (tc) {
      tc.status = 'completed'
      tc.result = t('ai.approvalNotDelivered', { error: e instanceof Error ? e.message : String(e) })
    }
    throw e
  }
  } finally {
    _pendingApprovalIds.delete(toolCallId)
  }
}

/** 批量审批:遍历 pendingApprovals 逐个调用 approveToolCall */
async function batchApprove(decision: 'approve' | 'reject') {
  const approved = decision === 'approve'
  // 快照当前待审批列表(遍历中 state.pendingApprovals 会因事件回调而缩短)
  const ids = [...state.pendingApprovals].map(p => p.id)
  for (const id of ids) {
    try {
      await approveToolCall(id, approved)
    } catch {
      // 单条失败不中断批量操作(已由 approveToolCall 内部回滚该条状态)
      // 继续处理剩余项
    }
  }
}

export function useAiApproval() {
  return {
    approveToolCall,
    batchApprove,
  }
}
