/**
 * MCP (Model Context Protocol) 类型定义
 */

import type { JSONSchema7 } from 'json-schema';

// ============================================================================
// 配置类型
// ============================================================================

/** 本地 MCP 服务器配置 (stdio 传输) */
export interface LocalMCPServer {
  type: 'local';
  /** 启动命令和参数，如 ["npx", "-y", "@anthropic/mcp-server-filesystem", "/path"] */
  command: string[];
  /** 环境变量，支持 {env:VAR} 语法引用系统环境变量 */
  env?: Record<string, string>;
  /** 工作目录 */
  cwd?: string;
  /** 是否启用，默认 true */
  enabled?: boolean;
  /** 超时毫秒数，默认 30000 */
  timeout?: number;
}

/** 远程 MCP 服务器配置 (HTTP/SSE 传输) */
export interface RemoteMCPServer {
  type: 'remote';
  /** MCP 端点 URL */
  url: string;
  /** 自定义请求头，支持 {env:VAR} 语法 */
  headers?: Record<string, string>;
  /** OAuth 配置，空对象 {} 表示自动发现 (RFC 7591) */
  oauth?: OAuthConfig | Record<string, never>;
  /** 是否启用，默认 true */
  enabled?: boolean;
  /** 超时毫秒数，默认 30000 */
  timeout?: number;
}

/** OAuth 配置 */
export interface OAuthConfig {
  clientId: string;
  clientSecret: string;
  scope?: string;
  /** Token 端点，可选，自动发现时不需要 */
  tokenEndpoint?: string;
}

/** MCP 服务器配置（本地或远程） */
export type MCPServerConfig = LocalMCPServer | RemoteMCPServer;

/** MCP 配置根节点 */
export interface MCPConfig {
  /** MCP 服务器配置，key 为服务器名称 */
  mcp?: Record<string, MCPServerConfig>;
  /** 工具启用/禁用配置，支持通配符如 "server-*" */
  tools?: Record<string, boolean>;
}

// ============================================================================
// 运行时类型
// ============================================================================

/** MCP 工具定义 */
export interface MCPTool {
  /** 来源服务器名称 */
  server: string;
  /** 完整工具名: {server}-{originalName} */
  name: string;
  /** MCP 服务器中的原始名称 */
  originalName: string;
  /** 工具描述 */
  description: string;
  /** 输入参数 JSON Schema */
  inputSchema: JSONSchema7;
  /** 输出结果 JSON Schema（可选） */
  outputSchema?: JSONSchema7;
}

/** 服务器运行状态 */
export type MCPServerStatusType =
  | 'connected'
  | 'connecting'
  | 'disconnected'
  | 'auth_required'
  | 'disabled'
  | 'error';

/** 服务器状态信息 */
export interface MCPServerStatus {
  /** 服务器名称 */
  name: string;
  /** 服务器类型 */
  type: 'local' | 'remote';
  /** 当前状态 */
  status: MCPServerStatusType;
  /** 工具数量 */
  toolCount: number;
  /** 错误信息（当 status 为 error 时） */
  error?: string;
  /** 最后连接时间 */
  lastConnected?: Date;
}

/** 工具调用结果 */
export interface MCPToolCallResult {
  /** 是否成功 */
  success: boolean;
  /** 结果内容 */
  content: MCPContent[];
  /** 是否为错误结果 */
  isError?: boolean;
}

/** MCP 内容类型 */
export type MCPContent =
  | MCPTextContent
  | MCPImageContent
  | MCPResourceContent;

/** 文本内容 */
export interface MCPTextContent {
  type: 'text';
  text: string;
}

/** 图片内容 */
export interface MCPImageContent {
  type: 'image';
  data: string;
  mimeType: string;
}

/** 资源内容 */
export interface MCPResourceContent {
  type: 'resource';
  resource: {
    uri: string;
    mimeType?: string;
    text?: string;
    blob?: string;
  };
}

// ============================================================================
// 传输层类型
// ============================================================================

/** JSON-RPC 请求 */
export interface JSONRPCRequest {
  jsonrpc: '2.0';
  id: string | number;
  method: string;
  params?: unknown;
}

/** JSON-RPC 响应 */
export interface JSONRPCResponse {
  jsonrpc: '2.0';
  id: string | number;
  result?: unknown;
  error?: JSONRPCError;
}

/** JSON-RPC 通知 */
export interface JSONRPCNotification {
  jsonrpc: '2.0';
  method: string;
  params?: unknown;
}

/** JSON-RPC 错误 */
export interface JSONRPCError {
  code: number;
  message: string;
  data?: unknown;
}

/** 传输层接口 */
export interface Transport {
  /** 启动传输 */
  start(): Promise<void>;
  /** 关闭传输 */
  close(): Promise<void>;
  /** 发送请求并等待响应 */
  request(method: string, params?: unknown): Promise<unknown>;
  /** 发送通知（无响应） */
  notify(method: string, params?: unknown): Promise<void>;
  /** 监听服务器通知 */
  onNotification(handler: (method: string, params: unknown) => void): void;
  /** 监听连接关闭 */
  onClose(handler: (error?: Error) => void): void;
}

// ============================================================================
// MCP 协议消息类型
// ============================================================================

/** 服务器能力 */
export interface ServerCapabilities {
  tools?: {
    listChanged?: boolean;
  };
  resources?: {
    subscribe?: boolean;
    listChanged?: boolean;
  };
  prompts?: {
    listChanged?: boolean;
  };
}

/** 客户端能力 */
export interface ClientCapabilities {
  roots?: {
    listChanged?: boolean;
  };
  sampling?: Record<string, never>;
}

/** 初始化请求参数 */
export interface InitializeParams {
  protocolVersion: string;
  capabilities: ClientCapabilities;
  clientInfo: {
    name: string;
    version: string;
  };
}

/** 初始化响应结果 */
export interface InitializeResult {
  protocolVersion: string;
  capabilities: ServerCapabilities;
  serverInfo: {
    name: string;
    version: string;
  };
  instructions?: string;
}

/** 工具列表响应 */
export interface ListToolsResult {
  tools: Array<{
    name: string;
    description?: string;
    inputSchema: JSONSchema7;
    outputSchema?: JSONSchema7;
  }>;
  nextCursor?: string;
}

/** 工具调用参数 */
export interface CallToolParams {
  name: string;
  arguments?: Record<string, unknown>;
}

/** 工具调用响应 */
export interface CallToolResult {
  content: MCPContent[];
  isError?: boolean;
}

// ============================================================================
// 事件类型
// ============================================================================

/** MCP Manager 事件 */
export interface MCPManagerEvents {
  'server:connected': (serverName: string) => void;
  'server:disconnected': (serverName: string, error?: Error) => void;
  'server:error': (serverName: string, error: Error) => void;
  'tools:changed': () => void;
}
