type Domain =
  | "INPUT" | "SAH" | "ALLOCATION" | "RULES" | "CHARGEABILITY" | "BUDGET"
  | "ESTIMATE" | "COMMERCIAL" | "EXPERIENCE" | "EFFORT" | "SPREAD";

export interface GraphNode {
  id: string;
  label: string;
  value: number | string;
  unit: string;
  domain: Domain;
  description: string;
  formula?: string;
  level: number;
}

export interface GraphLink {
  source: string;
  target: string;
  formula: string;
  weight: number;
}

export function n(
  id: string,
  label: string,
  value: number | string,
  unit: string,
  domain: Domain,
  description: string,
  level: number,
  formula?: string,
): GraphNode {
  return { id, label, value, unit, domain, description, level, ...(formula ? { formula } : {}) };
}

export function l(source: string, target: string, formula: string, weight = 1): GraphLink {
  return { source, target, formula, weight };
}

export function fmtPct(ratio: number): string {
  return `${(ratio * 100).toFixed(1)}%`;
}

export function fmtNum(value: number, decimals = 1): string {
  return value.toFixed(decimals);
}
