/**
 * 工作台事件总线
 * 
 * 统一管理所有工作台的 UI Schema 推送
 * 允许 Chatbot 根据 Agent 类型将 GenUI 响应推送到对应工作台
 * 
 * 特性：
 * - Schema 缓存：保存最后一次推送的 schema，新订阅者可立即获取
 * - 自动重放：组件挂载后会自动收到缓存的 schema
 */

import type { UISchema } from '@/ai/genui/types';
import type { GenUIAgentType } from './genUIRouter';

// 工作台 UI 监听器类型
type WorkbenchUIListener = (schema: UISchema) => void;

// 按 Agent 类型分组的监听器集合
const workbenchListeners: Record<GenUIAgentType, Set<WorkbenchUIListener>> = {
  manager: new Set(),
  product: new Set(),
  marketing: new Set(),
  finance: new Set(),
  service: new Set(),
};

// 缓存每个工作台最后一次的 UI Schema（解决组件未挂载时错过推送的问题）
const lastSchemaCache: Record<GenUIAgentType, UISchema | null> = {
  manager: null,
  product: null,
  marketing: null,
  finance: null,
  service: null,
};

/**
 * 订阅特定工作台的 UI 更新
 * 如果有缓存的 schema，会立即同步回调一次（不使用 setTimeout，避免竞态条件）
 */
export function subscribeToWorkbench(
  agentType: GenUIAgentType,
  callback: WorkbenchUIListener
): () => void {
  workbenchListeners[agentType].add(callback);
  
  // 立即同步回调缓存的 schema（如果存在）
  // 注意：不使用 setTimeout，让订阅者能立即获得数据并阻止后续的初始加载
  const cachedSchema = lastSchemaCache[agentType];
  if (cachedSchema) {
    console.log(`[WorkbenchEventBus] Replaying cached schema for ${agentType}`);
    callback(cachedSchema);
  }
  
  return () => {
    workbenchListeners[agentType].delete(callback);
  };
}

/**
 * 检查是否有缓存的 schema（用于跳过初始加载）
 */
export function hasCachedSchema(agentType: GenUIAgentType): boolean {
  return lastSchemaCache[agentType] !== null;
}

/**
 * 向特定工作台推送 UI Schema
 * 同时缓存 schema 供后续订阅者使用
 */
export function pushToWorkbench(agentType: GenUIAgentType, schema: UISchema): void {
  console.log(`[WorkbenchEventBus] Pushing UI to ${agentType} workbench`, schema);
  
  // 缓存 schema
  lastSchemaCache[agentType] = schema;
  
  // 推送给所有当前订阅者
  workbenchListeners[agentType].forEach(callback => callback(schema));
}

/**
 * 清除特定工作台的缓存（可选，用于重置状态）
 */
export function clearWorkbenchCache(agentType: GenUIAgentType): void {
  lastSchemaCache[agentType] = null;
}

/**
 * 广播 UI Schema 到所有工作台（通常不使用）
 */
export function broadcastToAllWorkbenches(schema: UISchema): void {
  Object.values(workbenchListeners).forEach(listeners => {
    listeners.forEach(callback => callback(schema));
  });
}

/**
 * 获取当前订阅数量（用于调试）
 */
export function getSubscriberCount(agentType: GenUIAgentType): number {
  return workbenchListeners[agentType].size;
}

/**
 * 获取所有订阅统计（用于调试）
 */
export function getAllSubscriberStats(): Record<GenUIAgentType, number> {
  return {
    manager: workbenchListeners.manager.size,
    product: workbenchListeners.product.size,
    marketing: workbenchListeners.marketing.size,
    finance: workbenchListeners.finance.size,
    service: workbenchListeners.service.size,
  };
}

/**
 * Agent 类型到 Tab 名称的映射
 * 用于自动导航到对应的工作台
 */
export const AGENT_TO_TAB_MAP: Record<GenUIAgentType, string> = {
  manager: 'home',
  product: 'products',
  marketing: 'marketing',
  finance: 'transactions',
  service: 'aftersales',
};
