/*
    Предрейсовые осмотры - мобильное приложение
    Хук отслеживания простоя
*/

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

const React = require('react'); //React и хуки
const { AppState } = require('react-native'); //Состояние приложения (active/background)
const { useAppLocalDbContext } = require('../components/layout/AppLocalDbProvider'); //Контекст локальной БД
const { useAppAuthContext } = require('../components/layout/AppAuthProvider'); //Контекст авторизации
const { useAppModeContext } = require('../components/layout/AppModeProvider'); //Контекст режима работы
const { useAppMessagingContext } = require('../components/layout/AppMessagingProvider'); //Контекст сообщений
const { AUTH_SETTINGS_KEYS } = require('../config/authConfig'); //Ключи настроек
const { IDLE_TIMEOUT_OFFLINE_MESSAGE, OFFLINE_MODE_TITLE } = require('../config/messages'); //Сообщения

//---------
//Константы
//---------

const IDLE_CHECK_INTERVAL_MS = 15000; //Проверка каждые 15 секунд

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

//Хук отслеживания простоя: при превышении лимита — запрос logout на сервер, переход в офлайн и сообщение
function useIdleTimeout() {
    const { getSetting } = useAppLocalDbContext();
    const { isAuthenticated, logout } = useAppAuthContext();
    const { APP_MODE, mode, setOffline } = useAppModeContext();
    const { showInfo } = useAppMessagingContext();

    const lastActivityAtRef = React.useRef(Date.now());
    const intervalIdRef = React.useRef(null);
    const appStateRef = React.useRef(AppState.currentState);

    //Сброс таймера простоя при любой активности
    const reportActivity = React.useCallback(() => {
        lastActivityAtRef.current = Date.now();
    }, []);

    //Проверка простоя
    const checkIdleAndLogout = React.useCallback(async () => {
        if (!isAuthenticated || appStateRef.current !== 'active' || mode === APP_MODE.OFFLINE) {
            return;
        }

        let idleMinutes = 0;
        try {
            const raw = await getSetting(AUTH_SETTINGS_KEYS.IDLE_TIMEOUT);
            const trimmed = raw != null ? String(raw).trim() : '';
            if (trimmed === '') {
                return;
            }
            idleMinutes = parseInt(trimmed, 10);
            if (isNaN(idleMinutes) || idleMinutes <= 0) {
                return;
            }
        } catch (err) {
            return;
        }

        const idleLimitMs = idleMinutes * 60 * 1000;
        const now = Date.now();
        if (now - lastActivityAtRef.current >= idleLimitMs) {
            try {
                await logout({ skipServerRequest: false, keepSessionLocally: true });
                setOffline();
                showInfo(IDLE_TIMEOUT_OFFLINE_MESSAGE, { title: OFFLINE_MODE_TITLE });
            } catch (logoutErr) {}
        }
    }, [isAuthenticated, getSetting, logout, mode, APP_MODE.OFFLINE, setOffline, showInfo]);

    //Запуск периодической проверки при авторизации; сброс времени активности при входе
    React.useEffect(() => {
        if (!isAuthenticated) {
            if (intervalIdRef.current != null) {
                clearInterval(intervalIdRef.current);
                intervalIdRef.current = null;
            }
            return;
        }

        lastActivityAtRef.current = Date.now();

        const intervalId = setInterval(checkIdleAndLogout, IDLE_CHECK_INTERVAL_MS);
        intervalIdRef.current = intervalId;

        return function cleanup() {
            if (intervalIdRef.current != null) {
                clearInterval(intervalIdRef.current);
                intervalIdRef.current = null;
            }
        };
    }, [isAuthenticated, checkIdleAndLogout]);

    //Учёт перехода приложения в фон/на передний план (не считать простой в фоне)
    React.useEffect(() => {
        const subscription = AppState.addEventListener('change', nextAppState => {
            appStateRef.current = nextAppState;
            if (nextAppState === 'active') {
                lastActivityAtRef.current = Date.now();
            }
        });

        return function cleanup() {
            subscription.remove();
        };
    }, []);

    return { reportActivity };
}

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

module.exports = useIdleTimeout;
