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

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

const React = require('react'); //React и хуки
const SQLiteDatabase = require('../database/SQLiteDatabase'); //Модуль SQLite

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

function useLocalDb() {
    //Состояние хука
    const [isDbReady, setIsDbReady] = React.useState(false);
    const [dbError, setDbError] = React.useState(null);

    //Отслеживания статуса инициализации
    const initializingRef = React.useRef(false);

    //Инициализация базы данных при монтировании
    React.useEffect(() => {
        let mounted = true;

        //Функция инициализации БД
        const initDb = async () => {
            //Предотвращаем повторную инициализацию
            if (initializingRef.current || SQLiteDatabase.isInitialized) {
                if (mounted && SQLiteDatabase.isInitialized) {
                    setIsDbReady(true);
                }
                return;
            }

            initializingRef.current = true;

            try {
                await SQLiteDatabase.initialize();
                if (mounted) {
                    setIsDbReady(true);
                    setDbError(null);
                }
            } catch (_initError) {
                if (mounted) {
                    setIsDbReady(false);
                    setDbError('Не удалось инициализировать базу данных');
                }
            } finally {
                initializingRef.current = false;
            }
        };

        initDb();

        return () => {
            mounted = false;
        };
    }, []);

    //Получение настройки
    const getSetting = React.useCallback(
        async key => {
            if (!isDbReady) {
                return null;
            }

            try {
                return await SQLiteDatabase.getSetting(key);
            } catch (_getSettingError) {
                return null;
            }
        },
        [isDbReady]
    );

    //Сохранение настройки
    const setSetting = React.useCallback(
        async (key, value) => {
            if (!isDbReady) return false;

            try {
                return await SQLiteDatabase.setSetting(key, value);
            } catch (_setSettingError) {
                return false;
            }
        },
        [isDbReady]
    );

    //Удаление настройки
    const deleteSetting = React.useCallback(
        async key => {
            if (!isDbReady) return false;

            try {
                return await SQLiteDatabase.deleteSetting(key);
            } catch (_deleteSettingError) {
                return false;
            }
        },
        [isDbReady]
    );

    //Получение всех настроек
    const getAllSettings = React.useCallback(async () => {
        if (!isDbReady) return {};

        try {
            return await SQLiteDatabase.getAllSettings();
        } catch (_getAllSettingsError) {
            return {};
        }
    }, [isDbReady]);

    //Очистка всех настроек
    const clearSettings = React.useCallback(async () => {
        if (!isDbReady) return false;

        try {
            return await SQLiteDatabase.clearSettings();
        } catch (_clearSettingsError) {
            return false;
        }
    }, [isDbReady]);

    //Оптимизация базы данных
    const vacuum = React.useCallback(async () => {
        if (!isDbReady) return false;

        try {
            return await SQLiteDatabase.vacuum();
        } catch (_vacuumError) {
            return false;
        }
    }, [isDbReady]);

    //Проверка существования таблицы
    const checkTableExists = React.useCallback(
        async tableName => {
            if (!isDbReady) return false;

            try {
                return await SQLiteDatabase.checkTableExists(tableName);
            } catch (_checkTableError) {
                return false;
            }
        },
        [isDbReady]
    );

    //Сохранение сессии авторизации
    const setAuthSession = React.useCallback(
        async session => {
            if (!isDbReady) return false;

            try {
                return await SQLiteDatabase.setAuthSession(session);
            } catch (_setAuthSessionError) {
                return false;
            }
        },
        [isDbReady]
    );

    //Получение сессии авторизации
    const getAuthSession = React.useCallback(async () => {
        if (!isDbReady) return null;

        try {
            return await SQLiteDatabase.getAuthSession();
        } catch (_getAuthSessionError) {
            return null;
        }
    }, [isDbReady]);

    //Очистка сессии авторизации
    const clearAuthSession = React.useCallback(async () => {
        if (!isDbReady) return false;

        try {
            return await SQLiteDatabase.clearAuthSession();
        } catch (_clearAuthSessionError) {
            return false;
        }
    }, [isDbReady]);

    return {
        isDbReady,
        error: dbError,
        getSetting,
        setSetting,
        deleteSetting,
        getAllSettings,
        clearSettings,
        vacuum,
        checkTableExists,
        setAuthSession,
        getAuthSession,
        clearAuthSession
    };
}

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

module.exports = useLocalDb;
