"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "useFocusController", {
    enumerable: true,
    get: function() {
        return useFocusController;
    }
});
var _react = require("react");
var _hooks = require("../../../../hooks");
var useFocusController = function useFocusController(param) {
    var _param_controlledRefs = param.controlledRefs, contentRef = _param_controlledRefs.contentRef, inputHelperRef = _param_controlledRefs.inputHelperRef, inputRef = _param_controlledRefs.inputRef, opened = param.opened, hasValue = param.hasValue, textContent = param.textContent, search = param.search, values = param.values, readOnly = param.readOnly, valueType = param.valueType, closedWithoutChanges = param.closedWithoutChanges, updateSearch = param.updateSearch, updateFocused = param.updateFocused, onChipClick = param.onChipClick;
    var prevSearch = (0, _hooks.usePreviousValue)(search);
    var prevValues = (0, _hooks.usePreviousValue)(values);
    var prevOpened = (0, _hooks.usePreviousValue)(opened);
    (0, _hooks.useDidMountEffect)(function() {
        if (!opened) {
            var _contentRef_current;
            updateFocused(false);
            (_contentRef_current = contentRef.current) === null || _contentRef_current === void 0 ? void 0 : _contentRef_current.scrollTo({
                left: 0
            });
        }
        var hasFocusAfterClose = prevOpened !== undefined && !opened && !(closedWithoutChanges === null || closedWithoutChanges === void 0 ? void 0 : closedWithoutChanges.current);
        if (opened || hasFocusAfterClose) {
            var _inputRef_current;
            (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();
        }
        // INFO: Помогает определить, произошло ли закрытие выпадающего меню при выборе значения.
        // Нужно для того, чтобы не фокусироваться на инпуте
        // ОЧЕНЬ не нравится это решение, но оно работает
        if ((closedWithoutChanges === null || closedWithoutChanges === void 0 ? void 0 : closedWithoutChanges.current) === false) {
            closedWithoutChanges.current = true;
        }
    }, [
        opened
    ]);
    (0, _hooks.useDidMountEffect)(function() {
        var prevValuesCount = (prevValues === null || prevValues === void 0 ? void 0 : prevValues.length) || 0;
        var valuesCount = (values === null || values === void 0 ? void 0 : values.length) || 0;
        if ((opened || prevOpened) && prevValuesCount < valuesCount) {
            var _inputRef_current;
            (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();
        }
    }, [
        values,
        readOnly
    ]);
    (0, _hooks.useDidMountEffect)(function() {
        if (!inputRef.current) {
            return;
        }
        // INFO: Для multiple
        if (search === '') {
            inputRef.current.style.flex = '1';
        }
        // INFO: Для single
        if (!opened && prevSearch !== search) {
            inputRef.current.style.flex = '1';
        }
        // INFO: Для кейсов, когда значение вырезано
        if (!inputRef.current.value.length) {
            inputRef.current.style.flex = '1';
            return;
        }
        if (valueType === 'multiple' && inputHelperRef.current) {
            var clientWidth = inputHelperRef.current.clientWidth;
            inputRef.current.style.flex = "1 0 ".concat(clientWidth, "px");
        }
    }, [
        readOnly,
        search,
        valueType
    ]);
    (0, _react.useEffect)(function() {
        var newSearch = hasValue ? textContent : '';
        // INFO: Заполнить поле input при первой инициализации
        if (prevOpened !== undefined && opened) {
            return;
        }
        if (valueType === 'single') {
            updateSearch === null || updateSearch === void 0 ? void 0 : updateSearch(newSearch, false);
        }
        if (valueType === 'multiple') {
            updateSearch === null || updateSearch === void 0 ? void 0 : updateSearch('', false);
        }
    }, [
        updateSearch,
        values,
        opened,
        hasValue,
        textContent,
        valueType
    ]);
    var onClickText = function onClickText(event) {
        var _inputRef_current;
        onChipClick === null || onChipClick === void 0 ? void 0 : onChipClick(event);
        (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();
    };
    var onFocusInput = function onFocusInput() {
        var _contentRef_current, _contentRef_current1;
        if (readOnly) {
            return;
        }
        // INFO: Жёсткий хак, нужный для корректного выделения всей строки после выбора значения.
        // Проблема возникает из-за очередности срабатывания useEffect, который сначала вызывает фокус
        // на элемент, а потом обновляет состояние inputRef
        if (valueType === 'single') {
            setTimeout(function() {
                var _inputRef_current;
                (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.select();
            });
        }
        (_contentRef_current1 = contentRef.current) === null || _contentRef_current1 === void 0 ? void 0 : _contentRef_current1.scrollTo({
            left: (_contentRef_current = contentRef.current) === null || _contentRef_current === void 0 ? void 0 : _contentRef_current.scrollWidth
        });
        updateFocused(true);
    };
    var onBlurInput = function onBlurInput() {
        if (!opened) {
            updateFocused(false);
        }
    };
    return {
        onClickText: onClickText,
        onFocusInput: onFocusInput,
        onBlurInput: onBlurInput
    };
};
