/**
 * Engine Registry — 引擎适配器的进程级注册表。
 *
 * 上层通过 backend 标识（sessions.backend）查找适配器，不感知具体引擎：
 *
 *   const engine = EngineRegistry.get(session.backend)
 *   const q = engine.createQuery(opts)
 *
 * 新增引擎只需：实现 AgentEngineAdapter + 在模块加载时 register()。
 */

import type { AgentEngineAdapter, EngineId } from './types'

class EngineRegistryImpl {
  private adapters = new Map<EngineId, AgentEngineAdapter>()

  /** 注册一个引擎适配器。重复注册同 id 会覆盖（热重载场景友好）。 */
  register(adapter: AgentEngineAdapter): void {
    this.adapters.set(adapter.id, adapter)
  }

  /**
   * 按 backend 标识获取适配器。
   * 未注册或传入空值时回退到 'claude'（Phase 0 唯一引擎）——
   * 保证旧 session（无 backend 字段）行为零变化。
   */
  get(id?: EngineId): AgentEngineAdapter {
    const adapter = (id && this.adapters.get(id)) || this.adapters.get(CLAUDE_FALLBACK)
    if (!adapter) {
      throw new Error(
        `[EngineRegistry] No engine registered for backend="${id ?? '(empty)'}" and no '${CLAUDE_FALLBACK}' fallback`,
      )
    }
    return adapter
  }

  /** 列出所有已注册引擎（前端引擎选择器使用） */
  list(): AgentEngineAdapter[] {
    return [...this.adapters.values()]
  }
}

/** 默认回退引擎标识。Phase 0 期间等于唯一引擎。 */
const CLAUDE_FALLBACK = 'claude'

export const EngineRegistry = new EngineRegistryImpl()
