/**拉平数组 */
export const treeToArray = <T>(treeNodes: T[]) => {
  let result: T[] = [];

  //递归函数 traverse，用于处理单个节点
  const traverse = (node: any) => {
    const newNode = { ...node };
    delete newNode.children;
    // 将没有子节点的新节点添加到结果数组中
    result.push(newNode);

    // 如果当前节点包含 children 属性（即有子节点）
    if (node.children) {
      node.children.forEach(traverse);
    }
  };

  treeNodes.forEach(traverse);

  return result;
};

/**
 * 线性匀速运动函数
 * @param t 当前时间戳差值
 * @param b 开始进度
 * @param c 结束进度
 * @param d 时长
 *  */
function linear(t: number, b: number, c: number, d: number): number {
  return (c * t) / d + b;
}

/**
 * 平滑移动
 * @param targetY 目标元素
 * @param duration 动画市场
 * @param scrollW 移动距离
 */
export function smoothScrollTo(
  targetY: HTMLDivElement,
  duration: number,
  scrollH: number,
) {
  const start = performance.now();
  const top = targetY.scrollTop;
  function step(timestamp: number) {
    if (timestamp < start + duration) {
      const progress = timestamp - start;
      const linearProgress = linear(progress, 0, 1, duration);

      targetY.scrollTo({
        top: top + scrollH * linearProgress,
      });
      requestAnimationFrame(step);
    } else {
      targetY.scrollTo({ top: top + scrollH });
    }
  }

  requestAnimationFrame(step);
}
