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

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

const React = require('react'); //React и хуки
const { View } = require('react-native'); //Базовые компоненты
const { LOAD_STATUS_LOADING } = require('../hooks/usePreTripInspections'); //Константы загрузки
const { useAppMessagingContext } = require('../components/layout/AppMessagingProvider'); //Контекст сообщений
const { useAppModeContext } = require('../components/layout/AppModeProvider'); //Контекст режима работы
const { useAppNavigationContext } = require('../components/layout/AppNavigationProvider'); //Контекст навигации
const { useAppLocalDbContext } = require('../components/layout/AppLocalDbProvider'); //Контекст локальной БД
const { useAppPreTripInspectionsContext } = require('../components/layout/AppPreTripInspectionsProvider'); //Контекст осмотров
const AppHeader = require('../components/layout/AppHeader'); //Заголовок с меню
const SideMenu = require('../components/menu/SideMenu'); //Боковое меню
const InspectionList = require('../components/inspections/InspectionList'); //Список осмотров
const { getAppInfo } = require('../utils/appInfo'); //Информация о приложении
const styles = require('../styles/screens/MainScreen.styles'); //Стили экрана

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

//Главный экран приложения
function MainScreen() {
    const { inspections, loadStatus, error, isDbReady, refreshInspections } = useAppPreTripInspectionsContext();
    const { showInfo } = useAppMessagingContext();
    const { mode } = useAppModeContext();
    const { navigate, SCREENS } = useAppNavigationContext();
    const { getSetting, isDbReady: isLocalDbReady } = useAppLocalDbContext();

    const [menuVisible, setMenuVisible] = React.useState(false);
    const [serverUrl, setServerUrl] = React.useState('');

    //Предотвращение повторной загрузки при монтировании
    const initialLoadRef = React.useRef(false);

    //Загрузка URL сервера при готовности БД
    React.useEffect(() => {
        if (!isLocalDbReady) {
            return;
        }

        const loadServerUrl = async () => {
            try {
                const savedUrl = await getSetting('app_server_url');
                if (savedUrl) {
                    setServerUrl(savedUrl);
                }
            } catch (loadError) {
                console.error('Ошибка загрузки URL сервера:', loadError);
            }
        };

        loadServerUrl();
    }, [isLocalDbReady, getSetting]);

    //Первичная загрузка данных
    React.useEffect(() => {
        //Выходим, если БД не готова или уже загружали
        if (!isDbReady || initialLoadRef.current) {
            return;
        }
        initialLoadRef.current = true;
        refreshInspections();
    }, [isDbReady, refreshInspections]);

    //Обработчик открытия меню
    const handleMenuOpen = React.useCallback(() => {
        setMenuVisible(true);
    }, []);

    //Обработчик закрытия меню
    const handleMenuClose = React.useCallback(() => {
        setMenuVisible(false);
    }, []);

    //Обработчик показа информации о приложении
    const handleShowAbout = React.useCallback(() => {
        const appInfo = getAppInfo({
            mode,
            serverUrl,
            isDbReady: isLocalDbReady
        });

        showInfo(appInfo, {
            title: 'Информация о приложении'
        });
    }, [showInfo, mode, serverUrl, isLocalDbReady]);

    //Пункты бокового меню
    const menuItems = React.useMemo(
        () => [
            {
                id: 'settings',
                title: 'Настройки',
                onPress: () => {
                    navigate(SCREENS.SETTINGS);
                }
            },
            {
                id: 'about',
                title: 'О приложении',
                onPress: handleShowAbout
            }
        ],
        [navigate, handleShowAbout, SCREENS.SETTINGS]
    );

    return (
        <View style={styles.container}>
            <AppHeader onMenuPress={handleMenuOpen} />

            <View style={styles.content}>
                <InspectionList
                    inspections={inspections}
                    isLoading={loadStatus === LOAD_STATUS_LOADING}
                    error={error}
                    onRefresh={refreshInspections}
                />
            </View>

            <SideMenu visible={menuVisible} onClose={handleMenuClose} items={menuItems} title="Меню" />
        </View>
    );
}

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

module.exports = MainScreen;
