import { useMemo } from "react";
import { isEmpty } from "../../../utils";
const createNavigationMaps = (items = [])=>{
    const pathMap = new Map();
    const focusedToValueMap = new Map();
    const valueToPathMap = new Map();
    pathMap.set('root', items?.length || 0);
    const rec = (itemsToMap, prevIndex = '', path = [])=>{
        itemsToMap?.forEach((item, index)=>{
            const { value, items: innerItems } = item;
            const currIndex = `${prevIndex}/${index}`.replace(/^(\/)/, '');
            focusedToValueMap.set(currIndex, item);
            valueToPathMap.set(value.toString(), [
                ...path,
                value.toString()
            ]);
            if (innerItems && !isEmpty(innerItems)) {
                pathMap.set(value, innerItems.length);
                rec(innerItems, currIndex, [
                    ...path,
                    value.toString()
                ]);
            }
        });
    };
    rec(items);
    return [
        pathMap,
        focusedToValueMap,
        valueToPathMap
    ];
};
const createSelectionMaps = (items = [])=>{
    const valueToCheckedMap = new Map();
    const valueToItemMap = new Map();
    const valueToPathMap = new Map();
    const rec = (itemsToMap, path = [])=>{
        itemsToMap?.forEach((item)=>{
            const { value, items: innerItems } = item;
            valueToCheckedMap.set(value, false);
            valueToPathMap.set(value.toString(), [
                ...path,
                value.toString()
            ]);
            if (!innerItems || isEmpty(innerItems)) {
                valueToItemMap.set(value, item);
            } else {
                rec(innerItems, [
                    ...path,
                    value.toString()
                ]);
            }
        });
    };
    rec(items);
    return [
        valueToCheckedMap,
        valueToItemMap,
        valueToPathMap
    ];
};
// Создает структуры для навигации по текущему видимому дереву.
export const useNavigationMaps = (items = [])=>{
    return useMemo(()=>createNavigationMaps(items), [
        items
    ]);
};
// Создает структуры для синхронизации выбранных значений по полному дереву.
export const useSelectionMaps = (items = [])=>{
    return useMemo(()=>createSelectionMaps(items), [
        items
    ]);
};
