"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSelectedTreeView = void 0;
const react_1 = require("react");
const array_1 = require("../../../../../utils/array");
const buildSelectedTree_1 = require("../../utils/buildSelectedTree");
const findInTree_1 = require("../../utils/findInTree");
const preserveNodeOrder_1 = require("../../utils/preserveNodeOrder");
const addIsForceExpandedFlag = (item) => {
    if (item.children) {
        return {
            ...item,
            options: { ...(item.options || {}), isForceExpanded: true },
        };
    }
    return item;
};
const useSelectedTreeView = ({ value, searchValue, onInputChange, onClearSearch, }) => {
    const [isShowSelectedTree, setIsShowSelectedTree] = (0, react_1.useState)();
    // Сохраняем порядок узлов
    const nodeOrderRef = (0, react_1.useRef)(new Map());
    // Строим дерево из выбранных элементов
    const selectedTreeData = (0, react_1.useMemo)(() => {
        if (!value || value.length === 0) {
            nodeOrderRef.current.clear();
            return [];
        }
        const tree = (0, buildSelectedTree_1.buildSelectedTree)(value);
        return (0, preserveNodeOrder_1.preserveNodeOrder)(tree, nodeOrderRef.current);
    }, [value]);
    // Применяем клиентский поиск к выбранным элементам
    const filteredSelectedTreeData = (0, react_1.useMemo)(() => {
        if (!isShowSelectedTree || !searchValue) {
            return selectedTreeData;
        }
        return (0, findInTree_1.findInTree)(selectedTreeData, searchValue);
    }, [selectedTreeData, searchValue, isShowSelectedTree]);
    // Определяем isNoResult для режима выбранных элементов
    const isNoResultInSelectedTree = !searchValue || !isShowSelectedTree
        ? false
        : filteredSelectedTreeData.length === 0;
    // Применяем флаг раскрытия для отфильтрованного дерева выбранных элементов
    const selectedTreeDataToRender = (0, react_1.useMemo)(() => {
        if (!searchValue || !isShowSelectedTree) {
            return filteredSelectedTreeData;
        }
        return (0, array_1.deepMap)(filteredSelectedTreeData, 'children', addIsForceExpandedFlag);
    }, [filteredSelectedTreeData, searchValue, isShowSelectedTree]);
    const onChangeTreeView = (event) => {
        const newIsShowSelectedTree = event.target.checked;
        setIsShowSelectedTree(newIsShowSelectedTree);
        onClearSearch();
        if (!newIsShowSelectedTree) {
            onInputChange('');
        }
    };
    (0, react_1.useEffect)(() => {
        // Когда все элементы убраны из выбранного дерева, возвращаемся на основное дерево
        if (!value?.length) {
            setIsShowSelectedTree(false);
        }
    }, [value]);
    return {
        isShowSelectedTree: isShowSelectedTree ?? false,
        setIsShowSelectedTree,
        selectedTreeData,
        filteredSelectedTreeData,
        selectedTreeDataToRender,
        onChangeTreeView,
        isNoResultInSelectedTree,
    };
};
exports.useSelectedTreeView = useSelectedTreeView;
