import { getDefaultDataByTheme } from "@/config/data";
import { isEqual, isArray } from "lodash-es";
import { Cell } from "@antv/x6";

/**
 * 获取两个对象之间的差异
 * 该函数通过递归比较两个对象，找出它们之间的差异部分，并返回这些差异组成的对象
 * 主要用于在两个较为复杂的对象结构中找到变化的部分，常用于数据同步、变更检测等场景
 * 
 * @param newData 新的数据对象，与旧数据对象进行比较以找出变化
 * @param oldData 旧的数据对象，作为比较的基础
 * @returns 返回一个对象，包含所有变化的属性和它们的新值
 */
export const getDifferences = <T extends Record<string, any> | any[]>(newData: T, oldData: T): Partial<T> => {
  // 处理基础类型、null和undefined
  if (typeof newData !== 'object' || newData === null) {
    return !isEqual(newData, oldData) ? newData : {} as Partial<T>;
  }

  const differences: Partial<T> = {};

  // 统一的比较处理函数
  const compareValue = (value: any, oldValue: any, key: string | number) => {
    if (typeof value === 'object' && value !== null) {
      const differenceVal = getDifferences(value, oldValue || {});
      if (!isEqual(differenceVal, {})) {
        differences[key] = differenceVal;
      }
    } else if (!isEqual(value, oldValue)) {
      differences[key] = value;
    }
  };

  if (Array.isArray(newData)) {
    newData.forEach((item, index) => {
      compareValue(item, oldData?.[index], index);
    });
  } else {
    Object.entries(newData).forEach(([key, value]) => {
      compareValue(value, oldData?.[key], key);
    });
  }

  return differences;
};

// 获取flow节点基础数据
export const getBasicData = (cellMeta: Cell.Properties) => {
  const themeKey = sessionStorage.getItem("flow-theme-key") || '1';

  // 先根据主题获取通用数据，然后返回差异部分
  const defaultData = getDefaultDataByTheme(themeKey);
  if(cellMeta.shape === "edge") {
    return getDifferences(cellMeta, defaultData.edgeDefaultData);
  } else {
    return getDifferences(cellMeta.data || {}, defaultData.nodeDefaultData);
  }
};