/**
 * Создает breadcrumbs для элемента на основе его позиции в пути
 */
const createBreadcrumbs = (path, currentIndex) => {
    if (currentIndex === 0) {
        return undefined;
    }
    // Берем все элементы до текущего индекса и создаем breadcrumbs
    // Breadcrumbs должны содержать только id, label, note (без children и options)
    return path.slice(0, currentIndex).map((item) => ({
        id: item.id,
        label: item.label,
        note: item.note,
    }));
};
/**
 * Получает или создает Map для дочернего узла
 */
const getOrCreateChildrenMap = (node, nodeChildrenMaps) => {
    const existingMap = nodeChildrenMaps.get(node);
    if (existingMap) {
        return existingMap;
    }
    const childrenMap = new Map();
    nodeChildrenMaps.set(node, childrenMap);
    // Если у узла уже есть children, добавляем их в Map
    if (node.children) {
        node.children.forEach((child) => {
            childrenMap.set(child.id, child);
        });
    }
    return childrenMap;
};
/**
 * Преобразует Map в массив TreeLikeAsyncAutocompleteValue
 */
const convertToArray = (level, nodeChildrenMaps) => {
    const result = [];
    level.forEach((node) => {
        const childrenMap = nodeChildrenMaps.get(node);
        const children = childrenMap && childrenMap.size > 0
            ? convertToArray(childrenMap, nodeChildrenMaps)
            : undefined;
        result.push({
            ...node,
            children: children && children.length > 0 ? children : undefined,
        });
    });
    return result;
};
/**
 * Строит дерево из выбранных элементов с учетом breadcrumbs
 * Если несколько элементов имеют общего родителя, они объединяются в один узел
 */
export const buildSelectedTree = (selectedItems) => {
    if (!selectedItems || selectedItems.length === 0) {
        return [];
    }
    const rootLevel = new Map();
    const nodeChildrenMaps = new WeakMap();
    // Обрабатываем каждый выбранный элемент
    selectedItems.forEach((item) => {
        // Строим путь от корня к элементу: breadcrumbs + сам элемент
        const path = [
            ...(item.breadcrumbs ?? []),
            item,
        ];
        // Проходим по пути и создаем/обновляем узлы дерева
        path.reduce((currentLevel, pathItem, index) => {
            const existingNode = currentLevel.get(pathItem.id);
            const restoredBreadcrumbs = createBreadcrumbs(path, index);
            if (existingNode) {
                // Если узел уже существует, обновляем его поля из pathItem
                const existingChildren = existingNode.children;
                Object.assign(existingNode, pathItem, {
                    children: existingChildren,
                    breadcrumbs: restoredBreadcrumbs,
                    options: {
                        ...existingNode.options,
                        ...pathItem.options,
                        isDefaultExpanded: true,
                    },
                });
                return getOrCreateChildrenMap(existingNode, nodeChildrenMaps);
            }
            // Создаем новый узел с восстановленными breadcrumbs
            const newNode = {
                ...pathItem,
                breadcrumbs: restoredBreadcrumbs,
                children: undefined,
                options: {
                    ...pathItem.options,
                    isDefaultExpanded: true,
                },
            };
            currentLevel.set(pathItem.id, newNode);
            return getOrCreateChildrenMap(newNode, nodeChildrenMaps);
        }, rootLevel);
    });
    return convertToArray(rootLevel, nodeChildrenMaps);
};
