//! AI 待决/流式信号共享态(叶子)—— textIdle / pendingMaxRounds / pendingDirAuths / pendingHelp
//! 及各自的定时器与 push/remove。
//!
//! 叶子定位:仅被导入,不导入任何子 composable(依赖仅 vue + appSettings),故无环风险。
//! useAiEvents 拆分后,streaming/tool/lifecycle 三域与组件(ChatInput/MaxRoundsCard/
//! DirAuthDialog/HelpRequiredCard)统一从这里取这些跨域信号。

import { ref } from 'vue'
import { useAppSettingsStore } from '@/stores/appSettings'

const appSettings = useAppSettingsStore()

// 文本空闲信号:streaming=true 且 300ms 无新 delta 时=true,按钮据此显「发送」而非「停止」。
// 不动 streaming(streaming 是渲染态,控制 MessageList 流式 block 显隐,不能中途翻转)。
export const textIdle = ref(true)
let _textIdleTimer: ReturnType<typeof setTimeout> | null = null

/** 每次新 delta 重置 300ms 空闲计时(textIdle=false 表示文本活跃) */
export function resetTextIdleTimer(): void {
  if (_textIdleTimer) clearTimeout(_textIdleTimer)
  textIdle.value = false
  _textIdleTimer = setTimeout(() => {
    textIdle.value = true
    _textIdleTimer = null
  }, 300)
}

/** 整轮结束/新轮开始清空闲计时并回落默认空闲 */
export function clearTextIdleTimer(): void {
  if (_textIdleTimer) { clearTimeout(_textIdleTimer); _textIdleTimer = null }
  textIdle.value = true
}

// 达 max_iterations 暂停态(后端仍 generating=true):存挂起 convId,null=无挂起。
// 消费方(MaxRoundsCard)按 pendingMaxRounds === activeConversationId 精确比对,多会话不串台。
export const pendingMaxRounds = ref<string | null>(null)

// 路径授权挂起(后端 AiDirAuthRequired 置,用户决策后清)。数组 push 多条并存:
// 同轮多个文件工具落不同未授权目录时,后端连发多条,单 ref 会被后到覆盖致弹窗丢失。
export interface PendingDirAuth {
  id: string
  tool: string
  path: string
  dir: string
  conversationId?: string
}
export const pendingDirAuths = ref<PendingDirAuth[]>([])

// 多挂起并存开关(appSettings key `df-ai-multi-pending-auth`):开=数组 push 多条;
// 关=单 ref 覆盖(后到覆盖先到,行为对齐旧版)。
function isMultiPendingAuth(): boolean {
  return appSettings.get<boolean>('df-ai-multi-pending-auth', true)
}

/** 向 pendingDirAuths 追加一条(开关控制多挂起并存 vs 单 ref 覆盖) */
export function pushPendingDirAuth(p: PendingDirAuth): void {
  if (isMultiPendingAuth()) {
    pendingDirAuths.value.push(p)
  } else {
    pendingDirAuths.value = [p]
  }
}

/** 按 id 从 pendingDirAuths 移除一条 */
export function removePendingDirAuth(id: string): void {
  pendingDirAuths.value = pendingDirAuths.value.filter(p => p.id !== id)
}

// 求助协议挂起(agent 断路器熔断时后端 AiHelpRequired 置):显 reason + options 驱动求助卡。
// 存挂起 convId,消费方按 activeConversationId 精确比对(多会话并发不串台)。
export interface PendingHelp {
  reason: string
  context: string
  options: string[]
  conversationId: string | null
}
export const pendingHelp = ref<PendingHelp | null>(null)
