import type { ProviderType } from '../types/index.js';
import type { PermissionAction, PermissionRule } from '../permission/types.js';

// 重新导出权限类型，方便外部使用
export type { PermissionAction, PermissionRule };

/**
 * Agent 模式
 * - primary: 主 Agent，用户直接使用
 * - subagent: 子 Agent，由 Task 工具调用
 * - all: 两种方式都可以
 * - internal: 内部使用，不对外暴露（如 Summary Agent）
 */
export type AgentMode = 'primary' | 'subagent' | 'all' | 'internal';

/**
 * Agent Bash 权限配置
 */
export interface AgentBashPermission {
  /** 是否启用 bash */
  enabled?: boolean;
  /** 命令规则，按顺序匹配（支持通配符如 "git diff*", "rm -rf*"） */
  rules?: PermissionRule[];
  /** 默认策略 */
  default?: PermissionAction;
}

/**
 * Agent 文件权限配置
 */
export interface AgentFilePermission {
  read?: PermissionAction;
  write?: PermissionAction;
  edit?: PermissionAction;
  delete?: PermissionAction;
  /** 敏感路径规则 */
  sensitivePaths?: PermissionRule[];
}

/**
 * Agent Git 权限配置
 */
export interface AgentGitPermission {
  /** 读操作（status, diff, log 等） */
  read?: PermissionAction;
  /** 写操作（add, commit, push 等） */
  write?: PermissionAction;
  /** 危险操作（force push, reset --hard 等） */
  dangerous?: PermissionAction;
}

/**
 * Agent 完整权限配置
 */
export interface AgentPermission {
  file?: AgentFilePermission;
  bash?: AgentBashPermission;
  web?: PermissionAction;
  git?: AgentGitPermission;
}

/**
 * Agent 模型配置
 */
export interface AgentModelConfig {
  /** Provider 类型 */
  provider?: ProviderType;
  /** 模型名称 */
  model?: string;
  /** 温度参数 */
  temperature?: number;
  /** Top P 参数 */
  topP?: number;
  /** 最大输出 tokens */
  maxTokens?: number;
}

/**
 * Agent 工具配置
 */
export interface AgentToolConfig {
  /** 禁用的工具列表 */
  disabled?: string[];
  /** 启用的工具列表（如果设置，则只启用这些） */
  enabled?: string[];
  /** 禁止嵌套 Task */
  noTask?: boolean;
}

/**
 * Agent 定义
 */
export interface AgentInfo {
  /** Agent 名称 */
  name: string;
  /** Agent 描述 */
  description: string;
  /** Agent 模式 */
  mode: AgentMode;
  /** 自定义 System Prompt */
  prompt?: string;
  /** 模型配置 */
  model?: AgentModelConfig;
  /** 工具配置 */
  tools?: AgentToolConfig;
  /** 权限配置 */
  permission?: AgentPermission;
  /** 最大执行步数 */
  maxSteps?: number;
}

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

/**
 * Agent 配置文件格式（用户自定义）
 */
export interface AgentConfigFile {
  /** 全局默认配置 */
  defaults?: AgentConfigFileDefaults;
  /** Agent 定义 */
  agents?: Record<string, Omit<AgentInfo, 'name'>>;
}

/**
 * 图片数据（用于 Agent 执行上下文）
 */
export interface ImageData {
  /** base64 编码的图片数据 */
  data: string;
  /** MIME 类型 */
  mimeType: string;
  /** 文件名（可选） */
  filename?: string;
}

/**
 * Agent 执行上下文
 */
export interface AgentExecutionContext {
  /** 父会话 ID */
  parentSessionId?: string;
  /** 工作目录 */
  workdir: string;
  /** 图片数据（用于支持多模态输入） */
  images?: ImageData[];
  /** 回调：输出流 */
  onStream?: (text: string) => void;
  /** 回调：工具调用 */
  onToolCall?: (toolName: string, params: Record<string, unknown>) => void;
  /** 回调：工具结果 */
  onToolResult?: (toolName: string, result: unknown) => void;
}

/**
 * Agent 执行结果
 */
export interface AgentExecutionResult {
  /** 是否成功 */
  success: boolean;
  /** 输出文本 */
  text: string;
  /** 执行步数 */
  steps: number;
  /** 会话 ID */
  sessionId: string;
  /** 错误信息 */
  error?: string;
}
