"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useLogic = void 0;
const react_1 = require("react");
const useTheme_1 = require("../../theme/hooks/useTheme");
const constants_1 = require("../constants");
const utils_1 = require("../utils");
const useLogic = ({ data = [], keyId, getOptionLabel, onChange, inputContainerRef, reservedWidth = 0, }) => {
    const [visibleOptions, setVisibleOptions] = (0, react_1.useState)([]);
    const [hiddenCount, setHiddenCount] = (0, react_1.useState)(0);
    const tagsContainerRef = (0, react_1.useRef)(null);
    const availableWidthRef = (0, react_1.useRef)(0);
    const theme = (0, useTheme_1.useTheme)();
    /**
     * Обновляет доступную ширину для расчета количества отображаемых тегов
     */
    const updateAvailableWidth = () => {
        const target = inputContainerRef?.current ?? tagsContainerRef.current;
        if (target) {
            availableWidthRef.current = (0, utils_1.getAvailableWidth)(target, reservedWidth);
        }
    };
    const recomputeMaxItems = () => {
        if (data.length === 0) {
            setVisibleOptions([]);
            setHiddenCount(0);
            return;
        }
        const hasNoInputContainer = !inputContainerRef?.current;
        const isZeroWidth = availableWidthRef.current === 0;
        const isSmallWidth = availableWidthRef.current < constants_1.MIN_AVAILABLE_WIDTH;
        // Если нет inputContainerRef и доступная ширина слишком мала или не вычислена - показываем первый тег и счетчик(если есть)
        if (hasNoInputContainer && (isZeroWidth || isSmallWidth)) {
            setVisibleOptions(data.slice(0, 1));
            setHiddenCount(data.length - 1);
            return;
        }
        // Если нет inputContainerRef и данных всего 1, показываем его даже при малой ширине (fallback)
        if (hasNoInputContainer && data.length === 1) {
            setVisibleOptions(data.slice(0, 1));
            setHiddenCount(0);
            return;
        }
        if (isSmallWidth) {
            setVisibleOptions([]);
            setHiddenCount(data.length);
        }
        // Расчет количества отображаемых тегов
        const labels = data.map((item) => getOptionLabel(item).toString());
        const visibleCount = (0, utils_1.calculateVisibleTagsCount)(labels, availableWidthRef.current, theme);
        const finalCount = Math.min(visibleCount, data.length);
        if (finalCount === 0 && hasNoInputContainer) {
            setVisibleOptions(data.slice(0, 1));
            setHiddenCount(data.length - 1);
            return;
        }
        setVisibleOptions(data.slice(0, finalCount));
        setHiddenCount(data.length - finalCount);
    };
    (0, react_1.useEffect)(() => {
        updateAvailableWidth();
    }, [reservedWidth]);
    (0, react_1.useLayoutEffect)(() => {
        recomputeMaxItems();
    }, []);
    (0, react_1.useEffect)(() => {
        if (!data.length) {
            setVisibleOptions([]);
            setHiddenCount(0);
            return;
        }
        const resizeObserver = new ResizeObserver(() => {
            updateAvailableWidth();
            recomputeMaxItems();
        });
        const target = inputContainerRef?.current ?? tagsContainerRef.current;
        if (!target) {
            return;
        }
        resizeObserver.observe(target);
        return () => {
            resizeObserver.disconnect();
        };
    }, [data]);
    const getTagProps = (option) => {
        const label = getOptionLabel(option);
        const onDelete = () => {
            const newValue = data.filter((value) => {
                if (typeof value === 'string') {
                    return value !== option;
                }
                if (keyId) {
                    return value[keyId] !== option[keyId];
                }
                return getOptionLabel(value) !== getOptionLabel(option);
            });
            onChange(newValue.length ? newValue : []);
        };
        return { label, shrinks: false, onDelete };
    };
    const showCounter = hiddenCount > 0;
    return {
        visibleOptions,
        hiddenCount,
        showCounter,
        tagsContainerRef,
        getTagProps,
    };
};
exports.useLogic = useLogic;
