/*
    Парус 8 - Панели мониторинга - УДП - Доски задач
    Пользовательские хуки: Хуки фильтра
*/

//---------------------
//Подключение библиотек
//---------------------

import { useState, useEffect, useCallback } from "react"; //Классы React
import { EVENT_STATES } from "../layouts"; //Перечисление состояний события
import { getLocalStorageValue } from "../layouts"; //Вспомогательные функции

//--------------------------
//Вспомогательные компоненты
//--------------------------

//Проверка возможности загрузки данных фильтра из локального хранилища
const isLocalStorageExists = () => {
    return getLocalStorageValue("sType");
};

//-----------
//Тело модуля
//-----------

//Хук фильтра
//const useFilters = filterOpen => {
const useFilters = () => {
    //Состояние фильтра
    const [filters, setFilters] = useState({
        loaded: false,
        isSetByUser: !isLocalStorageExists(),
        values: {
            sState: EVENT_STATES[1],
            sType: "",
            sCrnName: "",
            sCrnRnList: "",
            bSubcatalogs: false,
            sSendPerson: "",
            sSendDivision: "",
            sSendUsrGrp: "",
            sDocLink: ""
        }
    });

    //Установить значение фильтра
    const setFilterValues = useCallback((values, isSetByUser = true) => {
        setFilters({ loaded: true, isSetByUser: isSetByUser, values: values });
    }, []);

    //Загрузка значений фильтра из локального хранилища браузера
    const loadLocalStorageValues = useCallback(async () => {
        //Загружаем значения по умолчанию
        let values = { ...filters.values };
        //Обходим ключи объекта значений
        for (let key in values) {
            //Заполняем значениями из хранилища
            switch (key) {
                //Локальное хранилище не хранит булево, форматируем строку в булево
                case "bSubcatalogs":
                    values[key] = getLocalStorageValue(key) === "true";
                    break;
                //Не переносим информацию о связанных записях
                case "sDocLink":
                    break;
                //Переносим все остальные значения
                default:
                    values[key] = getLocalStorageValue(key, "");
                    break;
            }
        }
        //Устанавливаем значения фильтра
        setFilterValues(values, false);
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, []);

    //При изменении значений фильтра
    const handleFiltersChange = useCallback(
        filters => {
            setFilterValues(filters);
        },
        [setFilterValues]
    );

    //Сохранение при закрытии панели
    useEffect(() => {
        //Обработка события закрытия
        const onBeforeUnload = () => {
            //Обходим ключи фильтра
            for (let key in filters.values) {
                //Если это не связи - сохраняем значение в хранилище
                key !== "sDocLink" ? localStorage.setItem(key, filters.values[key] ? filters.values[key] : "") : null;
            }
        };
        //Если данные были загружены и произошли изменения
        if (filters.loaded && filters.isSetByUser) {
            //Вешаем обработчик события закрытия
            window.addEventListener("beforeunload", onBeforeUnload);
        }
        //Очищаем при размонтировании
        return () => {
            window.removeEventListener("beforeunload", onBeforeUnload);
        };
    }, [filters.loaded, filters.isSetByUser, filters.values]);

    //При подключении к странице
    useEffect(() => {
        //Если требуется загрузить фильтр из локального хранилища
        if (!filters.loaded && !filters.isSetByUser) {
            loadLocalStorageValues();
        }
    }, [filters.isSetByUser, filters.loaded, loadLocalStorageValues]);

    return [filters, handleFiltersChange];
};

//----------------
//Интерфейс модуля
//----------------

export { useFilters };
