/**
 * Shared API Types
 */

export interface Session {
  id: string;
  name?: string;
  createdAt: string;
  updatedAt: string;
  status: string;
  messageCount: number;
}

/**
 * 工具调用状态
 */
export type ToolCallStatus = 'pending' | 'running' | 'completed' | 'error';

/**
 * 工具调用信息
 */
export interface ToolCallInfo {
  id: string;
  name: string;
  arguments: Record<string, unknown>;
  status: ToolCallStatus;
  result?: unknown;
  error?: string;
  duration?: number; // 执行时长 ms
}

// ============ 消息 Parts 相关 ============

/**
 * 文本 Part
 */
export interface TextMessagePart {
  type: 'text';
  id: string;
  text: string;
}

/**
 * 工具调用 Part
 */
export interface ToolMessagePart {
  type: 'tool';
  id: string;
  toolCallId: string;
  toolName: string;
  status: ToolCallStatus;
  arguments: Record<string, unknown>;
  result?: unknown;
  error?: string;
  duration?: number;
}

/**
 * 推理 Part
 */
export interface ReasoningMessagePart {
  type: 'reasoning';
  id: string;
  text: string;
}

/**
 * 消息 Part 联合类型
 */
export type MessagePart = TextMessagePart | ToolMessagePart | ReasoningMessagePart;

/**
 * 消息格式（存储层已经是 2-message 格式，无需 API 层合并）
 *
 * 只有 user 和 assistant 两种角色：
 * - user: 用户输入
 * - assistant: AI 回复（包含文本和工具调用，按原始顺序）
 */
export interface Message {
  id: string;
  role: 'user' | 'assistant';
  timestamp: string;
  /** 有序的消息内容 Parts */
  parts: MessagePart[];
  /** 所有文本拼接（兼容字段） */
  content?: string;
  /** 所有工具调用（兼容字段） */
  toolCalls?: ToolCallInfo[];
  /** 是否包含推理过程 */
  hasReasoning?: boolean;
  /** 推理内容 */
  reasoning?: string;
  /** 元数据 */
  metadata?: {
    model?: string;
    stepCount?: number;
    totalTokens?: number;
    /** 生成此消息的 Agent 名称 */
    agentName?: string;
  };
}

export interface HealthStatus {
  status: string;
  timestamp: string;
  agent: {
    coreAvailable: boolean;
  };
  auth: {
    enabled: boolean;
    tokenCount: number;
  };
  stats: {
    sessions: number;
    websocket: { connections: number };
    sse: { connections: number };
  };
}

export interface FileInfo {
  name: string;
  path: string;
  type: 'file' | 'directory';
  size: number;
  modified: string;
  extension?: string;
}

export interface FileListResponse {
  success: boolean;
  data: {
    path: string;
    absolutePath: string;
    parent: string | null;
    files: FileInfo[];
  };
}

export interface FileReadResponse {
  success: boolean;
  data: {
    path: string;
    name: string;
    type: string;
    size: number;
    modified: string;
    content: string;
    encoding: 'utf-8' | 'base64';
  };
}

export interface FileTreeNode {
  name: string;
  path: string;
  type: 'file' | 'directory';
  children?: FileTreeNode[];
}

export interface FileTreeResponse {
  success: boolean;
  data: {
    path: string;
    tree: FileTreeNode[];
  };
}

export interface ServerConfig {
  workdir: string;
}

// ============ Command 相关 ============

export interface CommandInfo {
  name: string;
  description?: string;
  agent?: string;
  model?: string;
  subtask?: boolean;
  source: string;
  hasTemplate: boolean;
}

export interface CommandSearchResult {
  name: string;
  description?: string;
  source: string;
  score: number;
}

export interface CommandExecuteResult {
  prompt: string;
  agent?: string;
  model?: string;
  subtask?: boolean;
}

export interface CommandListResponse {
  commands: Array<{
    name: string;
    description?: string;
    source: string;
  }>;
  stats: {
    total: number;
    bySource: Record<string, number>;
  };
}

// ============ Command CRUD 相关 ============

export interface CreateCommandInput {
  /** 命令名称（支持嵌套如 deploy/staging） */
  name: string;
  /** 命令描述 */
  description?: string;
  /** 提示词模板 */
  template: string;
  /** 指定 Agent */
  agent?: string;
  /** 指定模型 */
  model?: string;
  /** 是否作为子任务执行 */
  subtask?: boolean;
  /** 存储位置 */
  scope: 'user' | 'project';
}

export interface UpdateCommandInput {
  /** 命令描述 */
  description?: string;
  /** 提示词模板 */
  template?: string;
  /** 指定 Agent */
  agent?: string;
  /** 指定模型 */
  model?: string;
  /** 是否作为子任务执行 */
  subtask?: boolean;
}

export interface CommandContent {
  name: string;
  description?: string;
  template: string;
  agent?: string;
  model?: string;
  subtask?: boolean;
  source: string;
  sourcePath?: string;
}

// ============ MCP 相关 ============

/** MCP 服务器状态类型 */
export type MCPServerStatusType =
  | 'connected'
  | 'connecting'
  | 'disconnected'
  | 'disabled'
  | 'error';

/** MCP 服务器状态 */
export interface MCPServerStatus {
  /** 服务器名称 */
  name: string;
  /** 服务器类型 */
  type: 'local' | 'remote';
  /** 当前状态 */
  status: MCPServerStatusType;
  /** 工具数量 */
  toolCount: number;
  /** 错误信息 */
  error?: string;
  /** 配置信息 */
  config?: {
    type: 'local' | 'remote';
    command?: string[];
    url?: string;
    timeout?: number;
    cwd?: string;
  };
  /** 工具列表（仅详情接口返回） */
  tools?: MCPToolInfo[];
}

/** MCP 工具信息 */
export interface MCPToolInfo {
  /** 完整工具名: {server}-{originalName} */
  name: string;
  /** 来源服务器名称 */
  server: string;
  /** MCP 服务器中的原始名称 */
  originalName: string;
  /** 工具描述 */
  description: string;
  /** 输入参数 JSON Schema */
  inputSchema?: Record<string, unknown>;
}

/** MCP 配置 */
export interface MCPConfig {
  /** MCP 服务器配置 */
  mcp?: Record<string, MCPServerConfigInfo>;
  /** 工具启用/禁用配置 */
  tools?: Record<string, boolean>;
}

/** MCP 服务器配置信息 */
export interface MCPServerConfigInfo {
  type: 'local' | 'remote';
  command?: string[];
  url?: string;
  enabled?: boolean;
  timeout?: number;
}

// ============ Hooks 相关 ============

/** Shell 命令配置 */
export interface ShellCommandConfig {
  /** 命令数组，如 ['npm', 'run', 'lint'] */
  command: string[];
  /** 环境变量 */
  environment?: Record<string, string>;
  /** 超时时间（毫秒） */
  timeout?: number;
  /** 工作目录 */
  cwd?: string;
}

/** 文件钩子配置 (glob pattern -> commands) */
export interface FileHookConfig {
  [pattern: string]: ShellCommandConfig[];
}

/** 完整钩子配置 */
export interface HookConfig {
  /** 文件编辑后触发 */
  file_edited?: FileHookConfig;
  /** 文件创建后触发 */
  file_created?: FileHookConfig;
  /** 文件删除后触发 */
  file_deleted?: FileHookConfig;
  /** 会话结束时触发 */
  session_completed?: ShellCommandConfig[];
}

/** 钩子命令测试结果 */
export interface HookTestResult {
  /** 是否成功 */
  success: boolean;
  /** 标准输出 */
  stdout: string;
  /** 标准错误输出 */
  stderr: string;
  /** 退出码 */
  exitCode: number;
  /** 执行时间（毫秒） */
  duration: number;
}

// ============ Agent 相关 ============

/** Agent 运行模式 */
export type AgentMode = 'primary' | 'subagent' | 'all' | 'internal';

/** Agent 模型配置 */
export interface AgentModelConfig {
  /** 提供商 */
  provider?: 'anthropic' | 'deepseek' | 'openai';
  /** 模型名称 */
  model?: string;
  /** 温度参数 (0-1) */
  temperature?: number;
  /** Top-P 采样 */
  topP?: number;
  /** 最大 Token 数 */
  maxTokens?: number;
}

/** Agent 工具配置 */
export interface AgentToolConfig {
  /** 禁用的工具列表 */
  disabled?: string[];
  /** 只启用的工具列表（与 disabled 互斥） */
  enabled?: string[];
  /** 禁止嵌套 Task 调用 */
  noTask?: boolean;
}

/** 权限规则 */
export interface PermissionRule {
  /** 匹配模式（glob 或正则） */
  pattern: string;
  /** 操作：允许或拒绝 */
  action: 'allow' | 'deny';
}

/** Bash 权限配置 */
export interface AgentBashPermission {
  /** 规则列表 */
  rules?: PermissionRule[];
  /** 默认操作 */
  defaultAction?: 'allow' | 'deny';
}

/** 文件权限配置 */
export interface AgentFilePermission {
  /** 读取权限 */
  read?: { rules?: PermissionRule[]; defaultAction?: 'allow' | 'deny' };
  /** 写入权限 */
  write?: { rules?: PermissionRule[]; defaultAction?: 'allow' | 'deny' };
}

/** Git 权限配置 */
export interface AgentGitPermission {
  /** 允许的命令 */
  commands?: string[];
  /** 是否允许 push */
  allowPush?: boolean;
  /** 是否允许 force 操作 */
  allowForce?: boolean;
}

/** Agent 权限配置 */
export interface AgentPermission {
  /** Bash 命令权限 */
  bash?: AgentBashPermission;
  /** 文件操作权限 */
  file?: AgentFilePermission;
  /** Git 操作权限 */
  git?: AgentGitPermission;
}

/** Agent 列表项 */
export interface AgentListItem {
  /** Agent 名称 */
  name: string;
  /** 描述 */
  description: string;
  /** 运行模式 */
  mode: AgentMode;
  /** 是否为预设 Agent */
  isPreset: boolean;
  /** 是否被用户自定义覆盖 */
  isCustomized: boolean;
  /** 使用的模型 */
  model?: string;
  /** 最大执行步数 */
  maxSteps?: number;
}

/** Agent 完整详情 */
export interface AgentDetail {
  /** Agent 名称 */
  name: string;
  /** 描述 */
  description: string;
  /** 运行模式 */
  mode: AgentMode;
  /** 是否为预设 */
  isPreset: boolean;
  /** 是否被自定义 */
  isCustomized?: boolean;
  /** System Prompt */
  prompt?: string;
  /** 模型配置 */
  model?: AgentModelConfig;
  /** 工具配置 */
  tools?: AgentToolConfig;
  /** 权限配置 */
  permission?: AgentPermission;
  /** 最大执行步数 */
  maxSteps?: number;
}

/** 创建/更新 Agent 输入 */
export interface AgentInput {
  /** 描述 */
  description: string;
  /** 运行模式 */
  mode: AgentMode;
  /** System Prompt */
  prompt?: string;
  /** 模型配置 */
  model?: AgentModelConfig;
  /** 工具配置 */
  tools?: AgentToolConfig;
  /** 权限配置 */
  permission?: AgentPermission;
  /** 最大执行步数 */
  maxSteps?: number;
}

/** 全局默认配置 */
export interface AgentDefaults {
  /** 最大执行步数 */
  maxSteps?: number;
  /** 模型配置 */
  model?: AgentModelConfig;
  /** Vision 模型配置（用于图片理解） */
  vision?: AgentModelConfig;
  /** 权限配置 */
  permission?: AgentPermission;
}

// ============ Checkpoint 相关 ============

/** 检查点触发类型 */
export type CheckpointTrigger =
  | 'auto'
  | 'manual'
  | 'tool:write_file'
  | 'tool:edit_file'
  | 'tool:delete_file'
  | 'tool:move_file'
  | 'tool:copy_file'
  | 'tool:bash'
  | 'task_start'
  | 'task_complete'
  | 'pre_rollback'
  | 'session_start'
  | 'session_end';

/** 文件变更类型 */
export type FileChangeType = 'added' | 'modified' | 'deleted' | 'renamed';

/** 检查点列表项 */
export interface CheckpointListItem {
  /** 唯一标识 */
  id: string;
  /** 用户可读名称 */
  name?: string;
  /** 描述信息 */
  description?: string;
  /** 创建时间戳 */
  timestamp: number;
  /** 触发类型 */
  trigger: CheckpointTrigger;
  /** 受影响的文件数 */
  filesChanged: number;
  /** Git commit hash */
  commitHash: string;
  /** 关联的消息 ID */
  messageId?: string;
  /** 会话 ID */
  sessionId?: string;
}

/** 检查点详情 */
export interface CheckpointDetail extends CheckpointListItem {
  /** 关联的工具调用 */
  toolCall?: {
    tool: string;
    params: Record<string, unknown>;
  };
  /** 对话轮次 */
  turnIndex?: number;
}

/** 文件变更信息 */
export interface FileChange {
  /** 文件路径 */
  path: string;
  /** 变更类型 */
  type: FileChangeType;
  /** 旧路径 (重命名时) */
  oldPath?: string;
  /** 添加的行数 */
  insertions?: number;
  /** 删除的行数 */
  deletions?: number;
}

/** 差异信息 */
export interface DiffInfo {
  /** 源检查点/commit */
  from: string;
  /** 目标检查点/commit */
  to: string;
  /** 变更的文件列表 */
  files: FileChange[];
  /** 总添加行数 */
  totalInsertions: number;
  /** 总删除行数 */
  totalDeletions: number;
}

/** 文件差异详情 */
export interface FileDiffDetail {
  /** 文件路径 */
  path: string;
  /** 变更类型 */
  type: FileChangeType;
  /** 旧内容 */
  oldContent?: string;
  /** 新内容 */
  newContent?: string;
  /** 差异补丁 (unified diff 格式) */
  patch?: string;
}

/** 恢复模式 */
export type RestoreMode = 'ai_changes_only' | 'workspace_only' | 'full';

/** 恢复选项 */
export interface RestoreOptions {
  /** 恢复模式 */
  mode?: RestoreMode;
  /** 只恢复指定文件 */
  files?: string[];
  /** 跳过安全检查 */
  skipSafetyCheck?: boolean;
}

/** 恢复结果 */
export interface RestoreResult {
  /** 是否成功 */
  success: boolean;
  /** 恢复的文件列表 */
  restoredFiles: string[];
  /** 错误列表 */
  errors: Array<{ file: string; error: string }>;
  /** 回滚前的 commit hash */
  previousCommit?: string;
}

/** 安全检查结果 */
export interface SafetyCheckResult {
  /** 是否安全 */
  safe: boolean;
  /** 警告列表 */
  warnings: string[];
  /** 错误列表 */
  errors: string[];
}

/** 检查点统计信息 */
export interface CheckpointStats {
  /** 检查点数量 */
  count: number;
  /** 最早时间戳 */
  oldestTimestamp: number | null;
  /** 最新时间戳 */
  newestTimestamp: number | null;
}

/** Unrevert 状态 */
export interface UnrevertStatus {
  /** 是否可撤销回滚 */
  canUnrevert: boolean;
  /** 最后一次回滚记录 */
  lastRollback?: {
    id: string;
    timestamp: number;
    targetCheckpoint: string;
    restoredFiles: string[];
  };
}

/** Unrevert 结果 */
export interface UnrevertResult {
  /** 是否成功 */
  success: boolean;
  /** 恢复的 commit */
  restoredCommit: string;
  /** 恢复的文件数 */
  filesRestored: number;
  /** 错误信息 */
  error?: string;
}

// ============ Provider 相关 ============

/** 内置提供商类型 */
export type BuiltinProviderType = 'anthropic' | 'deepseek' | 'openai';

/** 提供商类型（内置 + 自定义） */
export type ProviderType = BuiltinProviderType | string;

/** 模型能力 */
export interface ModelCapabilities {
  /** 是否支持视觉 */
  vision?: boolean;
  /** 是否支持函数调用 */
  functionCalling?: boolean;
  /** 是否支持流式输出 */
  streaming?: boolean;
}

/** 模型信息 */
export interface ModelInfo {
  /** 模型 ID */
  id: string;
  /** 显示名称 */
  name: string;
  /** 模型能力 */
  capabilities?: ModelCapabilities;
  /** 上下文窗口大小 */
  contextWindow?: number;
  /** 最大输出 Token */
  maxOutput?: number;
}

/** 提供商列表项 */
export interface ProviderListItem {
  /** 提供商 ID */
  id: string;
  /** 显示名称 */
  name: string;
  /** 描述 */
  description?: string;
  /** 是否为内置提供商 */
  builtin: boolean;
  /** 是否启用 */
  enabled: boolean;
  /** 是否配置了 API Key */
  hasApiKey: boolean;
  /** 模型数量 */
  modelCount: number;
}

/** 提供商详情 */
export interface ProviderDetail {
  /** 提供商 ID */
  id: string;
  /** 显示名称 */
  name: string;
  /** 描述 */
  description?: string;
  /** 是否为内置提供商 */
  builtin: boolean;
  /** API 基础 URL */
  baseUrl?: string;
  /** API Key 环境变量名 */
  apiKeyEnvVar?: string;
  /** 可用模型列表 */
  models: ModelInfo[];
  /** 是否允许自定义模型 */
  allowCustomModels: boolean;
  /** 配置信息 */
  config: {
    enabled: boolean;
    hasApiKey: boolean;
    baseUrl?: string;
    customModels: ModelInfo[];
  };
}

/** 自定义提供商定义 */
export interface CustomProviderDefinition {
  /** 提供商 ID */
  id: string;
  /** 显示名称 */
  name: string;
  /** 描述 */
  description?: string;
  /** API 基础 URL（必填） */
  baseUrl: string;
  /** API Key 环境变量名 */
  apiKeyEnvVar?: string;
  /** 预设模型列表 */
  models?: ModelInfo[];
  /** 是否允许自定义模型 */
  allowCustomModels?: boolean;
}

/** 提供商配置（用户设置） */
export interface ProviderConfig {
  /** 提供商 ID */
  id?: string;
  /** API Key */
  apiKey?: string;
  /** API Key 环境变量名 */
  apiKeyEnvVar?: string;
  /** 自定义 API 基础 URL */
  baseUrl?: string;
  /** 是否启用 */
  enabled?: boolean;
  /** 自定义模型列表 */
  customModels?: ModelInfo[];
}

/** 连接测试结果 */
export interface ConnectionTestResult {
  /** 是否成功 */
  success: boolean;
  /** 延迟（毫秒） */
  latency?: number;
  /** 错误信息 */
  error?: string;
}

// ============ 上下文压缩相关 ============

/** Token 使用情况 */
export interface TokenUsage {
  /** 当前输入 tokens */
  input: number;
  /** 上下文限制 */
  contextLimit: number;
  /** 可用空间 */
  available: number;
  /** 使用百分比 (0-100) */
  usagePercent: number;
}

/** 上下文使用信息（包含格式化字符串） */
export interface ContextUsageInfo extends TokenUsage {
  /** 格式化字符串，如 "12.5K/100K (12%)" */
  formatted: string;
  /** 是否建议压缩 */
  shouldCompress: boolean;
}

/** 压缩状态 */
export type CompressionStatus =
  | 'success'
  | 'noop'
  | 'failed_empty_summary'
  | 'failed_token_inflated'
  | 'failed_error';

/** 压缩类型 */
export type CompressionType = 'prune' | 'compaction' | 'both' | 'none';

/** 压缩结果 */
export interface CompressionResult {
  /** 压缩类型 */
  type: CompressionType;
  /** 压缩状态 */
  status: CompressionStatus;
  /** 释放的 tokens */
  freedTokens: number;
  /** 错误信息 */
  error?: string;
  /** 原始 tokens（压缩前） */
  originalTokens?: number;
  /** 摘要 tokens（压缩后） */
  summaryTokens?: number;
}

// ============ WebSocket 错误相关 ============

/**
 * 配置错误 Payload
 *
 * 当 Provider 未配置 API Key 时，通过 WebSocket 返回此错误
 */
export interface ConfigErrorPayload {
  /** 错误类型标识 */
  type: 'config_error';
  /** 错误消息 */
  message: string;
  /** 缺失配置的 Provider */
  provider?: string;
  /** 建议的操作 */
  action: 'open_providers_panel' | 'open_settings';
}

// ============ 文件搜索相关 ============

/** 文件搜索结果 */
export interface FileSearchResult {
  /** 相对路径 */
  path: string;
  /** 文件名 */
  name: string;
  /** 文件类型 */
  type: 'file' | 'directory';
  /** 扩展名 */
  extension?: string;
}

/** 文件搜索响应 */
export interface FileSearchResponse {
  success: boolean;
  data: {
    files: FileSearchResult[];
    total: number;
  };
}

// ============ Agent 模式切换相关 ============

/** Agent 模式类型 (Build/Plan) */
export type AgentModeType = 'build' | 'plan';

// ============ 流式工具调用事件 ============

/** 工具开始事件 Payload */
export interface ToolStartPayload {
  /** 工具调用唯一 ID */
  id: string;
  /** 工具名称 */
  toolName: string;
  /** 调用参数 */
  arguments: Record<string, unknown>;
}

/** 工具结束事件 Payload */
export interface ToolEndPayload {
  /** 对应 tool_start 的 ID */
  id: string;
  /** 执行状态 */
  status: 'completed' | 'error';
  /** 执行结果 */
  result?: unknown;
  /** 错误信息 */
  error?: string;
  /** 执行时长 (ms) */
  duration?: number;
}

