/**
 * 工作流类型定义
 * 基于数据模型设计文档（JSON Schema，前后端统一）
 * 参考：docs/04-数据模型设计.md
 */

// ============== 基础类型 ==============

/**
 * 字段类型（JSON Schema 标准类型）
 */
export type FieldType = 
  | 'string' 
  | 'number' 
  | 'boolean' 
  | 'object' 
  | 'array'

/**
 * 表单字段类型（前端表单控件）
 */
export type FormFieldType = 
  | 'text'         // 文本输入
  | 'textarea'     // 多行文本
  | 'number'       // 数字输入
  | 'select'       // 下拉选择
  | 'code'         // 代码编辑器
  | 'key_value'    // 键值对
  | 'boolean'      // 布尔开关

/**
 * 节点分类（与后端对齐）
 */
export type NodeCategory = 
  | 'api'          // API 调用
  | 'database'     // 数据库操作
  | 'logic'        // 逻辑控制
  | 'notification' // 通知
  | 'transform'    // 数据转换
  | 'other'        // 其他

// ============== 节点类型元数据（后端返回）==============

/**
 * 字段定义（NodeTypeMetadata.fields 中的元素）
 * 对应后端 FieldDefinition
 */
export interface FieldDefinition {
  /** 字段名称（用于 config 中的 key） */
  name: string
  /** 显示标签 */
  label: string
  /** 表单控件类型 */
  type: FormFieldType
  /** 是否必填 */
  required?: boolean
  /** 是否支持表达式（如 ${nodes.n1.output.body.email}） */
  supportsExpression?: boolean
  /** 是否支持字段映射（显示字段选择器） */
  supportsFieldMapping?: boolean
  /** 下拉选项（用于 select 类型） */
  options?: string[]
  /** 默认值 */
  defaultValue?: any
  /** 占位符 */
  placeholder?: string
  /** 代码编辑器语言（用于 code 类型） */
  language?: string
}

/**
 * 节点类型元数据（从后端 /api/node-types 获取）
 * 对应后端 NodeTypeMetadata
 */
export interface NodeTypeMetadata {
  /** 节点类型唯一标识（如 http_request） */
  id: string
  /** 驼峰命名（如 httpRequest） */
  name: string
  /** 显示名称 */
  displayName: string
  /** 节点分类 */
  category: NodeCategory
  /** 图标名称 */
  icon?: string
  /** 描述 */
  description?: string
  /** 字段定义列表（驱动动态表单） */
  fields: FieldDefinition[]
  /** 输出 Schema（JSON Schema 格式，用于字段映射） */
  outputSchema: {
    type: 'object'
    properties: Record<string, any>
  }
  /** 后端实现类（可选） */
  implementationClass?: string
  /** 是否启用 */
  enabled?: boolean
}

// ============== 工作流定义（对应后端 WorkflowDefinition）==============

/**
 * 位置信息
 */
export interface Position {
  x: number
  y: number
}

/**
 * 工作流节点（对应后端 WorkflowNode）
 * 保存到数据库的标准格式
 */
export interface WorkflowNode {
  /** 节点 ID（唯一） */
  id: string
  /** 节点类型（对应 NodeTypeMetadata.id，如 http_request） */
  type: string
  /** 节点显示名称 */
  name: string
  /** 节点位置（画布坐标） */
  position: Position
  /** 节点配置数据（字段值，可包含表达式 ${...}） */
  config: Record<string, any>
}

/**
 * 工作流边（对应后端 WorkflowEdge）
 */
export interface WorkflowEdge {
  /** 边 ID（可选，自动生成） */
  id?: string
  /** 源节点 ID */
  source: string
  /** 目标节点 ID */
  target: string
  /** 条件表达式（用于条件分支，必须是 ${...} 格式） */
  condition?: string
}

/**
 * 工作流定义（对应后端 WorkflowDefinition）
 * 前后端统一的数据结构
 */
export interface WorkflowDefinition {
  /** 工作流 ID */
  id: string
  /** 工作流名称 */
  name: string
  /** 工作流描述 */
  description?: string
  /** Schema 版本（固定为 "1.0"） */
  schemaVersion: '1.0'
  /** 节点列表 */
  nodes: WorkflowNode[]
  /** 边列表 */
  edges: WorkflowEdge[]
  /** 工作流变量 */
  variables?: Record<string, any>
  /** 元数据 */
  metadata?: Record<string, any>
}

// ============== Vue Flow 扩展（仅前端使用）==============

/**
 * Vue Flow 节点数据（前端画布渲染）
 * 包含运行时状态和元数据信息
 */
export interface VueFlowNodeData {
  /** 节点显示名称 */
  name: string
  /** 节点类型 */
  type: string
  /** 节点配置 */
  config: Record<string, any>
  /** 节点元数据（从 NodeTypeMetadata 获取） */
  metadata?: NodeTypeMetadata
  /** 执行状态（运行时） */
  status?: 'pending' | 'running' | 'success' | 'error'
  /** 错误信息 */
  error?: string
}

/**
 * Vue Flow 节点（前端画布使用）
 */
export interface VueFlowNode {
  id: string
  type: string
  position: Position
  /** Vue Flow 节点数据 */
  data: VueFlowNodeData
  /** 是否选中 */
  selected?: boolean
  /** 是否可拖拽 */
  draggable?: boolean
  /** 是否可连接 */
  connectable?: boolean
  [key: string]: any
}

/**
 * Vue Flow 边（前端画布使用）
 */
export interface VueFlowEdge {
  id: string
  source: string
  target: string
  /** 源节点输出句柄 ID */
  sourceHandle?: string
  /** 目标节点输入句柄 ID */
  targetHandle?: string
  /** 是否动画 */
  animated?: boolean
  /** 标签 */
  label?: string
  /** 样式 */
  style?: Record<string, any>
  /** 边类型 */
  type?: string
  /** 边数据 */
  data?: {
    condition?: string
    [key: string]: any
  }
  [key: string]: any
}

// ============== 字段映射相关 ==============

/**
 * JSON Schema 属性定义
 */
export interface JSONSchemaProperty {
  type: FieldType | string
  description?: string
  properties?: Record<string, JSONSchemaProperty>
  items?: JSONSchemaProperty
  [key: string]: any
}

/**
 * 字段路径节点（用于字段树）
 * 从 outputSchema 构建的树形结构，用于字段映射选择器
 */
export interface FieldPathNode {
  /** 字段名称 */
  name: string
  /** 字段完整路径（如 output.body.email） */
  path: string
  /** 字段类型 */
  type: FieldType | string
  /** 字段描述 */
  description?: string
  /** 子字段 */
  children?: FieldPathNode[]
  /** 是否是叶子节点 */
  isLeaf?: boolean
}

/**
 * 上游节点输出（用于字段映射选择）
 */
export interface UpstreamNodeOutput {
  /** 节点 ID */
  nodeId: string
  /** 节点名称 */
  nodeName: string
  /** 节点类型 */
  nodeType: string
  /** 输出 Schema */
  outputSchema: NodeTypeMetadata['outputSchema']
  /** 字段树（从 outputSchema 构建） */
  fieldTree: FieldPathNode[]
}

// ============== 执行结果（对应后端 NodeExecutionResult）==============

/**
 * 节点执行结果
 */
export interface NodeExecutionResult {
  /** 执行状态 */
  status: 'success' | 'failed' | 'running'
  /** 输出数据 */
  output: Record<string, any>
  /** 错误信息 */
  error: string | null
  /** 开始时间（ISO 8601） */
  startTime: string
  /** 结束时间（ISO 8601） */
  endTime: string
  /** 执行时长（毫秒） */
  durationMs: number
}

// ============== API 响应类型 ==============

/**
 * API 响应包装
 */
export interface ApiResponse<T = any> {
  code: number
  message: string
  data: T
  success: boolean
}

/**
 * 节点类型列表响应
 */
export interface NodeTypeListResponse {
  nodeTypes: NodeTypeMetadata[]
}

/**
 * 工作流执行请求
 */
export interface ExecuteWorkflowRequest {
  workflowId: string
  input?: Record<string, any>
}

/**
 * 工作流执行结果
 */
export interface WorkflowExecutionResult {
  executionId: string
  status: 'running' | 'completed' | 'failed'
  startTime: string
  endTime?: string
  result?: any
  error?: string
  nodeExecutions: Array<{
    nodeId: string
    status: 'pending' | 'running' | 'success' | 'error'
    input?: any
    output?: any
    error?: string
    startTime?: string
    endTime?: string
  }>
}

// ============== 前端工具类型 ==============

/**
 * 历史记录项（前端撤销/重做）
 */
export interface HistoryItem {
  nodes: WorkflowNode[]
  edges: WorkflowEdge[]
  timestamp: number
}

/**
 * 拖拽数据（从节点面板拖拽到画布）
 */
export interface DragNodeData {
  nodeTypeId: string
  metadata: NodeTypeMetadata
}

