/**
 * 思维导图核心类型定义
 * 
 * 设计原则：
 * - 数据与渲染分离
 * - 类型安全
 * - 可序列化（支持保存/加载）
 */

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

/** 点坐标 */
export interface Point {
  x: number
  y: number
}

/** 尺寸 */
export interface Size {
  width: number
  height: number
}

/** 矩形区域 */
export interface Rect extends Point, Size {}

/** 布局类型 */
export type LayoutType =
  | 'radial-mindmap'      // 放射思维导图（中心放射、左右对称）
  | 'logic-tree'          // 逻辑树（根节点在左侧，子节点向右展开）
  | 'fishbone'            // 鱼骨图/石川图
  | 'tree'                // 树形图（从上到下）
  | 'org-chart'           // 组织结构图
  | 'timeline-horizontal' // 横向时间轴
  | 'timeline-vertical'   // 纵向时间轴
  | 'force-directed'      // 力导向图

// ===== 节点类型 =====

/** 节点数据 */
export interface NodeData {
  /** 节点ID */
  id: string
  /** 节点标签/文本 */
  label: string
  /** 节点描述 */
  description?: string
  /** 是否为根节点 */
  isRoot?: boolean
  /** 自定义样式 */
  style?: NodeStyle
  /** 自定义数据 */
  [key: string]: unknown
}

/** 节点样式 */
export interface NodeStyle {
  /** 背景色 */
  fill?: string
  /** 边框色 */
  stroke?: string
  /** 文字颜色 */
  color?: string
  /** 字体大小 */
  fontSize?: number
  /** 字体粗细 */
  fontWeight?: string
  /** 圆角 */
  borderRadius?: number
  /** 宽度 */
  width?: number
  /** 高度 */
  height?: number
}

/** 节点完整信息（包含布局后位置） */
export interface Node extends NodeData {
  /** 布局后的位置 */
  position: Point
  /** 计算后的尺寸 */
  size: Size
  /** 层级深度 */
  level: number
  /** 子节点ID列表 */
  children: string[]
  /** 父节点ID */
  parentId?: string
  /** 是否折叠 */
  collapsed?: boolean
  /** 是否隐藏（折叠状态下） */
  hidden?: boolean
}

// ===== 边类型 =====

/** 边数据 */
export interface EdgeData {
  /** 边ID */
  id: string
  /** 源节点ID */
  source: string
  /** 目标节点ID */
  target: string
  /** 边类型 */
  type?: EdgeType
  /** 自定义样式 */
  style?: EdgeStyle
}

/** 边类型 */
export type EdgeType = 'bezier' | 'straight' | 'smoothstep' | 'fishbone'

/** 边样式 */
export interface EdgeStyle {
  /** 线条颜色 */
  stroke?: string
  /** 线条宽度 */
  strokeWidth?: number
  /** 虚线 */
  dashArray?: string
}

/** 边完整信息 */
export interface Edge extends EdgeData {
  /** 源连接点位置（相对于源节点） */
  sourcePoint?: Point
  /** 目标连接点位置（相对于目标节点） */
  targetPoint?: Point
}

// ===== 图模型类型 =====

/** 图数据 */
export interface GraphData {
  nodes: Node[]
  edges: Edge[]
  layoutType: LayoutType
}

/** 序列化数据（用于保存） */
export interface SerializedGraph {
  nodes: NodeData[]
  edges: EdgeData[]
  layoutType: LayoutType
  viewport?: Viewport
  modified?: string
}

// ===== 布局引擎类型 =====

/** 布局配置 */
export interface LayoutConfig {
  /** 节点水平间距 */
  nodeSpacingX: number
  /** 节点垂直间距 */
  nodeSpacingY: number
  /** 根节点位置 */
  rootPosition: Point
  /** 其他自定义配置 */
  [key: string]: unknown
}

/** 图模型接口 */
export interface IGraphModel {
  /** 所有节点 */
  nodes: Node[]
  /** 所有边 */
  edges: Edge[]
  /** 根节点 */
  root: Node | undefined
  /** 布局类型 */
  layoutType: LayoutType
  /** 获取节点 */
  getNode(id: string): Node | undefined
  /** 获取子节点 */
  getChildren(nodeId: string): Node[]
  /** 获取父节点 */
  getParent(nodeId: string): Node | undefined
  /** 获取子孙节点 */
  getDescendants(nodeId: string): Node[]
  /** 更新节点位置 */
  updateNodePosition(id: string, position: Point): void
  /** 序列化 */
  serialize(): SerializedGraph
}

/** 布局引擎接口 */
export interface ILayoutEngine {
  /** 布局类型名称 */
  readonly type: LayoutType
  
  /** 执行布局计算 */
  layout(graph: IGraphModel): Map<string, Point>
  
  /** 获取默认配置 */
  getDefaultConfig(): LayoutConfig
}

// ===== 渲染器类型 =====

/** 渲染配置 */
export interface RendererConfig {
  /** Canvas 宽度 */
  width: number
  /** Canvas 高度 */
  height: number
  /** 背景色 */
  backgroundColor?: string
  /** 设备像素比 */
  pixelRatio?: number
  /** 是否显示网格 */
  showGrid?: boolean
  /** 网格大小 */
  gridSize?: number
}

/** 渲染上下文 */
export interface RenderContext {
  ctx: CanvasRenderingContext2D
  config: RendererConfig
  viewport: Viewport
}

/** 视口状态 */
export interface Viewport {
  /** 缩放比例 */
  zoom: number
  /** 平移X */
  panX: number
  /** 平移Y */
  panY: number
}

// ===== 交互类型 =====

/** 交互事件类型 */
export type InteractionEventType =
  | 'node:click'
  | 'node:dblclick'
  | 'node:contextmenu'
  | 'node:toggle-collapse'
  | 'node:add-child'
  | 'node:drag:start'
  | 'node:drag:move'
  | 'node:drag:end'
  | 'canvas:click'
  | 'canvas:drag'
  | 'selection:start'
  | 'selection:move'
  | 'selection:end'
  | 'zoom'
  | 'pan'
  | 'description:hover'

/** 交互事件 */
export interface InteractionEvent {
  type: InteractionEventType
  nodeId?: string
  position: Point
  delta?: Point
  viewport: Viewport
  originalEvent: MouseEvent | WheelEvent
  /** 多选节点 ID 列表 */
  selectedIds?: string[]
  /** 节点描述（用于悬浮提示） */
  description?: string
}

/** 选择状态 */
export interface SelectionState {
  selectedIds: Set<string>
  selectionBox?: Rect
}

/** 编辑状态 */
export interface EditState {
  editingNodeId: string | null
  cursorPosition: number
}

// ===== 事件回调类型 =====

export type GraphEventHandler = (event: InteractionEvent) => void
export type NodeChangeHandler = (node: Node) => void
export type EdgeChangeHandler = (edge: Edge) => void
