/**
 * 节点形状尺寸映射表
 */

export const shapeMap: Record<string, { width: number, height: number }> = {
  'start-node': { width: 36, height: 36 },
  'end-node': { width: 36, height: 36 },
  'normal-task-node': { width: 100, height: 80 },
  'user-task-node': { width: 100, height: 80 },
  'exclusive-gateway-node': { width: 50, height: 50 },
  'parallel-gateway-node': { width: 50, height: 50 },
};

// 点类型
export interface Point { x: number, y: number };

/**
 * 计算两直角折线的两个中间点，保证折线为轴对齐（水平/垂直段）。
 *
 * 策略:
 *  - 'auto'：优先尝试水平优先（h-first），若会退化（例如 start.y === end.y）则改用垂直优先。
 *  - 'h-first'：先水平再竖直再水平（p1 在 start.y，p2 在 end.y）。
 *  - 'v-first'：先竖直再水平再竖直（p1 在 start.x，p2 在 end.x）。
 *
 * 参数:
 *  - options.gap: 当起点与终点在同一纵或横线导致退化时，用 gap 做偏移（默认 40）。
 *
 * 返回: [p1, p2]
 */
export function computeTwoBendPoints(
  start: Point,
  end: Point,
  options?: { strategy?: 'auto' | 'h-first' | 'v-first', gap?: number },
): [Point, Point] {
  const strategy = options?.strategy ?? 'auto';
  const gap = typeof options?.gap === 'number' ? options!.gap : 40;

  const tryHFirst = (): [Point, Point] => {
    // 中间 x 取中点；若和 start.x/end.x 相等（退化），用偏移 gap
    let xMid = (start.x + end.x) / 2;
    if (xMid === start.x && xMid === end.x) {
      // start.x === end.x，取一个偏移来避免退化
      xMid = start.x + (start.x <= end.x ? gap : -gap);
    }
    const p1: Point = { x: xMid, y: start.y };
    const p2: Point = { x: xMid, y: end.y };
    return [p1, p2];
  };

  const tryVFirst = (): [Point, Point] => {
    let yMid = (start.y + end.y) / 2;
    if (yMid === start.y && yMid === end.y) {
      // start.y === end.y，取一个偏移来避免退化
      yMid = start.y + (start.y <= end.y ? gap : -gap);
    }
    const p1: Point = { x: start.x, y: yMid };
    const p2: Point = { x: end.x, y: yMid };
    return [p1, p2];
  };

  // 特殊情况：完全相同的点
  if (start.x === end.x && start.y === end.y) {
    // 做一个小的 U 型绕行
    const p1: Point = { x: start.x + gap, y: start.y };
    const p2: Point = { x: start.x + gap, y: start.y };
    return [p1, p2];
  }

  if (strategy === 'h-first') {
    return tryHFirst();
  }
  else if (strategy === 'v-first') {
    return tryVFirst();
  }
  else {
    // auto: 尝试 h-first，如果会退化（即 start.y===end.y 或 start.x===end.x 导致水平段或竖直段为0）
    // 我们判断退化的简单策略：若 start.y===end.y 则 h-first 中间会使竖直段为 0（退化）
    if (start.y !== end.y && !(start.x === end.x)) {
      // 普通不同，更安全选择 h-first（常用）
      return tryHFirst();
    }
    else {
      // 否则用 v-first
      return tryVFirst();
    }
  }
}
// 导出时edge起点坐标转换函数
export function getTransformedEdgeStartPoint(oldStartPoint: Point, sourceNodeType: string): Point | null {
  if (!oldStartPoint) {
    return null;
  }
  return {
    x: oldStartPoint.x + (shapeMap[sourceNodeType]?.width || 0) / 2,
    y: oldStartPoint.y,
  };
}

// 导出时edge终点坐标转换函数
export function getTransformedEdgeEndPoint(oldEndPoint: Point, targetNodeType: string): Point | null {
  if (!oldEndPoint) {
    return null;
  }
  return {
    x: oldEndPoint.x - (shapeMap[targetNodeType]?.width || 0) / 2,
    y: oldEndPoint.y,
  };
}

// 导入时 转换节点的x\y
export function getTransformedNodePointForImport(oldX: number, oldY: number, nodeType: string): Point {
  return {
    x: oldX + (shapeMap[nodeType]?.width || 0) / 2,
    y: oldY + (shapeMap[nodeType]?.height || 0) / 2,
  };
}

// 导出时转换节点的x\y
export function getTransformedNodePointForExport(oldX: number, oldY: number, nodeType: string): Point {
  return {
    x: oldX - (shapeMap[nodeType]?.width || 0) / 2,
    y: oldY - (shapeMap[nodeType]?.height || 0) / 2,
  };
}
