// Получение accessorKey колонки
export const getColumnKey = (node) => node?.accessorKey;

// Проверка, нужно ли скрыть колонку из дерева
export const shouldExcludeFromTree = (node, excludeSet) => {
  if (node?.hideInTree) return true;
  const key = getColumnKey(node);
  return Boolean(key && excludeSet.has(key));
};

// Фильтрация дерева колонок по списку исключений
export const filterColumnTree = (nodes, excludeColumnKeys = []) => {
  if (!nodes?.length) return [];

  const excludeSet = new Set(excludeColumnKeys);

  return nodes.flatMap((node) => {
    if (shouldExcludeFromTree(node, excludeSet)) return [];

    const hasChildren = Array.isArray(node.columns) && node.columns.length > 0;
    if (!hasChildren) return [node];

    const filteredChildren = filterColumnTree(node.columns, excludeColumnKeys);
    if (filteredChildren.length === 0) return [];

    return [{ ...node, columns: filteredChildren }];
  });
};

// Получение accessorKey всех листовых колонок из дерева
export const getColumnTreeLeafKeys = (nodes) => {
  const keys = [];

  const collect = (cols) => {
    for (const col of cols) {
      if (col.columns?.length) {
        collect(col.columns);
      } else {
        const key = getColumnKey(col);
        if (key) keys.push(key);
      }
    }
  };

  collect(nodes);
  return keys;
};

// Сбор листовых колонок
export const getLeafColumns = (targetColumn) => {
  if (!targetColumn) return [];

  const collectLeafColumns = (col) => {
    if (!col.subHeaders?.length) return [col];
    return col.subHeaders.flatMap(collectLeafColumns);
  };

  return collectLeafColumns(targetColumn);
};

// Сбор всех листовых колонок из иерархии
export const collectLeafColumns = (column) => {
  if (column.columns?.length === 0 || !column.columns) return [column];
  if (column.columns?.length > 0 && (column.columns[0]?.columns?.length === 0 || !column.columns)) {
    return column.columns;
  }
  return (
    column.columns?.flatMap((childCol) => collectLeafColumns(childCol)) || []
  );
};

// Получение всех ID листовых колонок
export const getLeafColumnIds = (columns) => {
  const leafIds = [];

  const collect = (col) => {
    if (!col.columns?.length) {
      leafIds.push(col.id);
    } else {
      col.columns.forEach(collect);
    }
  };

  columns.forEach(collect);
  return leafIds;
};
