import { TableValue } from '../tcoLocalStorage';
interface ColumnsAOrM {
  item: any;
  index: number;
}
/**
 * 对比缓存数组，找出表格列中新增或者修改的数据
 * @param columnsReady 表格列（传入时需要先排除不参与的列）
 */
export const getColumnsAOrM = (
  columnsReady: any[],
  tableValue: TableValue[]
) => {
  // ✨ 找出新增/修改，（删除场景不需要这里的逻辑）的列数组（匹配 columnsReady not in tableValue)
  const arr: ColumnsAOrM[] = [];
  if (tableValue.length > 0) {
    let item: any;
    for (let i = 0, len = columnsReady.length; i < len; i++) {
      item = columnsReady[i];
      if (!tableValue.find(_ => _.dataIndex === item.dataIndex + ''))
        arr.push({ item, index: i });
    }
  }
  return arr;
};

/**
 * 判断缓存 tableValue 中是否有额外的 item（有：表示有表格列被删除了）
 */
export const getTableValueExtra = (
  columnsReady: any[],
  tableValue: TableValue[]
) => {
  let arr: TableValue[] = [];
  if (tableValue.length > 0 && columnsReady.length > 0) {
    arr = tableValue.filter(
      item => !columnsReady.find(_ => _.dataIndex + '' === item.dataIndex)
    );
  }
  return arr;
};

/**
 * 插入新数据
 */
export const insertColumnsAOrM = (
  columnsByTableValue: any[],
  columnsAOrM: ColumnsAOrM[]
) => {
  for (const item of columnsAOrM)
    columnsByTableValue.splice(item.index, 0, item.item);
  return columnsByTableValue;
};

/**
 * 根据 tableValue 获取需要渲染的列
 * @param columnsReady 表格列（传入时需要先排除不参与的列）
 * @param condition 条件，表格会根据 visible 来进行显示，但是拖拽列会全部显示
 */
export const getColumnsByTableValue = (
  columnsReady: any,
  tableValue: TableValue[],
  condition = (item?: any) => item?.visible === 1
) => {
  // 通过缓存渲染正确的列
  const arr: any[] = [];
  if (tableValue.length > 0) {
    for (const item of tableValue) {
      if (condition(item)) {
        const obj = columnsReady.find(
          (_: any) => _.dataIndex + '' === item.dataIndex
        );
        // ✨ 表格的 dataIndex 被修改了，导致本地缓存对应不上
        obj && arr.push(obj);
      }
    }
  }
  return arr;
};

/**
 * 解析 Exclude，由于 table 存在这种形式的 dataIndex [foo,bar]，所以这里转换为字符串方便后续判断
 */
export const parseExclude = (exclude: Array<string | string[]> = []) => {
  return exclude.map(_ => _ + '');
};

export const STORAGE_KEY = 'unity-tco';
