import { useEffect, useMemo, useState, } from 'react';
import { deepMap } from '../../../utils/array';
import { useSelectedTreeView } from './hooks';
export const useLogic = ({ isOpen, initialValue, options, onChange, dialogProps, onInputChange, onRetry, meta, onShowUserHint, isLoadingModal, minSymbolsToFetch = 0, isLoading, isLoadingError, loadingErrorMsg, treeProps, }) => {
    const [value, setValue] = useState(initialValue);
    const [searchValue, setSearchValue] = useState();
    const { onClose, ...restDialogProps } = dialogProps;
    useEffect(() => {
        setValue(initialValue);
    }, [initialValue]);
    useEffect(() => {
        // В поле ввода вставляем выбранное значение или пустую строку для запроса на открытие модального окна
        if (isOpen) {
            setSearchValue('');
        }
    }, [isOpen]);
    const onClearSearch = () => {
        setSearchValue('');
    };
    const { isShowSelectedTree, selectedTreeDataToRender, onChangeTreeView, isNoResultInSelectedTree, } = useSelectedTreeView({
        value,
        searchValue,
        onInputChange,
        onClearSearch,
    });
    const addIsForceExpandedFlag = (item) => {
        if (item.children) {
            return {
                ...item,
                options: { ...(item.options || {}), isForceExpanded: true },
            };
        }
        return item;
    };
    // Если строка поиска не пустая и загрузки нет, то раскрываем все дерево в отфильтрованной выдаче
    const optionToRender = useMemo(() => searchValue && !isLoading
        ? deepMap(options, 'children', addIsForceExpandedFlag)
        : options, [options, searchValue, isLoading]);
    const handleChangeSearchField = (event) => {
        const newSearchValue = event.target.value;
        setSearchValue(newSearchValue);
        // В режиме выбранных элементов используем клиентский поиск, не вызываем onInputChange
        // В обычном режиме используем асинхронный поиск через запросы
        if (!isShowSelectedTree) {
            onInputChange(newSearchValue);
        }
    };
    const handleChange = (newValue) => setValue(newValue);
    const handleClose = (event) => {
        setValue(initialValue);
        onClose?.(event, 'escapeKeyDown');
    };
    const handleCancel = (event) => {
        setValue(initialValue);
        onClose?.(event, 'escapeKeyDown');
    };
    const handleClick = (event) => {
        onChange?.(value);
        onClose?.(event, 'escapeKeyDown');
    };
    // Определяем isNoResult в зависимости от режима
    const isNoResult = useMemo(() => {
        if (!searchValue) {
            return false;
        }
        // В режиме выбранных элементов проверяем отфильтрованное дерево
        if (isShowSelectedTree) {
            return isNoResultInSelectedTree;
        }
        // В обычном режиме проверяем options
        return !options.length;
    }, [
        searchValue,
        isShowSelectedTree,
        isNoResultInSelectedTree,
        options.length,
    ]);
    const isDisabledButton = !value || isNoResult;
    const handleRetry = () => {
        onRetry?.(searchValue);
    };
    const isShowUserHint = onShowUserHint?.(options) || meta?.isAllDataLoaded;
    const isShowModalLoader = isLoadingModal && options.length === 0;
    const isShowSearchFieldLoader = (isLoading && !isLoadingModal) ||
        (isLoading && isLoadingModal && options.length > 0);
    // Подсказка о минимальном количестве символов показывается только в обычном режиме
    const isShowSearchSuggestion = Boolean(!isShowSelectedTree &&
        ((!searchValue && minSymbolsToFetch > 0) ||
            (searchValue && searchValue.length < minSymbolsToFetch)));
    return {
        isShowModalLoader,
        isShowSearchFieldLoader,
        isNoResult,
        handleRetry,
        isShowUserHint,
        isShowSearchSuggestion,
        treeProps,
        loadingErrorMsg,
        isLoadingError,
        badgeContent: value?.length ?? 0,
        isShowSelectedTree,
        checkableTagProps: {
            onChange: onChangeTreeView,
            checked: isShowSelectedTree,
            disabled: !value?.length,
            size: 'large',
            variant: 'light',
            label: 'Показать выбранные',
            color: 'default',
        },
        selectedTreeProps: {
            value,
            data: selectedTreeDataToRender,
            onChange: handleChange,
            isObjectMode: true,
            isInitialExpanded: true,
        },
        modalProps: {
            onClose: handleClose,
            disableRestoreFocus: true,
            open: isOpen,
            size: 'md',
            ...restDialogProps,
        },
        searchFieldProps: {
            value: searchValue,
            onChange: handleChangeSearchField,
        },
        treeListProps: {
            value,
            data: optionToRender,
            onChange: handleChange,
            isObjectMode: true,
        },
        cancelButtonProps: {
            onClick: handleCancel,
        },
        confirmButtonProps: {
            disabled: isDisabledButton,
            onClick: handleClick,
        },
    };
};
