/**
 * SmartSankeyChart — TypeScript 契约（仅基础条带桑基图）。
 */

import type { CSSProperties } from 'react';

/** 输入侧节点：须含稳定 `id`；`source`/`target` 与之对应 */
export interface SmartSankeyNodeInput {
  id: string;
  /** 外侧标签主文案（受 `config.showDataTitle` 控制） */
  label: string;
  /** 外侧标签第二行占比（0–100） */
  labelPercent?: number;
  /** 节点色槽（如 `data-2`），未传时回落到全图 `config.dataColorToken` */
  colorToken?: string;
}

export interface SmartSankeyLinkInput {
  source: string;
  target: string;
  value: number;
  /** 连线色槽（如 `data-4`），未传时默认跟随 source 节点色 */
  colorToken?: string;
  /** 连线基础透明度（0–1），未传时回落到 config.linkOpacity，最终默认 0.2 */
  opacity?: number;
}

export interface SmartSankeyMargin {
  top?: number;
  right?: number;
  bottom?: number;
  left?: number;
}

export interface SmartSankeyChartConfig {
  height?: number;
  margin?: SmartSankeyMargin;
  nodePadding?: number;
  nodeWidth?: number;
  formatValue?: (value: number) => string;
  resolveRoot?: Element | null;
  /** 顶栏标题（可选） */
  title?: string;
  /** 数据可视化色槽（如 `data-0`），节点实色与连线透色共用，默认 `data-0` */
  dataColorToken?: string;
  /** 连线基础透明度（默认 0.2） */
  linkOpacity?: number;
  /** 是否显示节点外侧「数据标题」双行标签，默认 true */
  showDataTitle?: boolean;
}

export interface SmartSankeyChartSpec {
  nodes: SmartSankeyNodeInput[];
  links: SmartSankeyLinkInput[];
  config?: SmartSankeyChartConfig;
}

export interface SmartSankeyChartProps {
  spec: SmartSankeyChartSpec;
  className?: string;
  style?: CSSProperties;
}

export type SmartSankeyLayoutNode = SmartSankeyNodeInput & {
  index?: number;
  depth?: number;
  height?: number;
  layer?: number;
  x0?: number;
  x1?: number;
  y0?: number;
  y1?: number;
  value?: number;
  sourceLinks?: unknown[];
  targetLinks?: unknown[];
};

export type SmartSankeyLayoutLink = SmartSankeyLinkInput & {
  index?: number;
  width?: number;
  y0?: number;
  y1?: number;
  source?: SmartSankeyLayoutNode;
  target?: SmartSankeyLayoutNode;
};
