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

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

const React = require('react'); //React
const { View, Pressable } = require('react-native'); //Базовые компоненты
const AppText = require('../common/AppText'); //Общий текстовый компонент
const AppLogo = require('../common/AppLogo'); //Логотип приложения
const { useAppModeContext } = require('./AppModeProvider'); //Контекст режима работы
const { useAppNavigationContext } = require('./AppNavigationProvider'); //Контекст навигации
const { useAppMessagingContext } = require('./AppMessagingProvider'); //Контекст сообщений
const { getModeLabel, getModeDescription } = require('../../utils/appInfo'); //Утилиты информации
const styles = require('../../styles/layout/AppHeader.styles'); //Стили заголовка

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

//Индикатор режима работы
function ModeIndicator({ mode, onPress }) {
    //Получение конфигурации стилей для режима
    const getModeStyleConfig = React.useCallback(() => {
        switch (mode) {
            case 'ONLINE':
                return {
                    color: styles.modeOnline,
                    textColor: styles.modeTextOnline
                };
            case 'OFFLINE':
                return {
                    color: styles.modeOffline,
                    textColor: styles.modeTextOffline
                };
            case 'NOT_CONNECTED':
                return {
                    color: styles.modeNotConnected,
                    textColor: styles.modeTextNotConnected
                };
            default:
                return {
                    color: styles.modeUnknown,
                    textColor: styles.modeTextUnknown
                };
        }
    }, [mode]);

    const styleConfig = getModeStyleConfig();
    const label = getModeLabel(mode);

    return (
        <Pressable style={({ pressed }) => [styles.modeContainer, styleConfig.color, pressed && styles.modePressed]} onPress={onPress}>
            <AppText style={[styles.modeText, styleConfig.textColor]}>{label}</AppText>
        </Pressable>
    );
}

//Иконка стрелки назад
function BackArrowIcon() {
    return (
        <View style={styles.backArrowIcon}>
            <View style={styles.backArrowLineTop} />
            <View style={styles.backArrowLineBottom} />
        </View>
    );
}

//Кнопка назад
function BackButton({ onPress }) {
    return (
        <Pressable
            accessibilityRole="button"
            accessibilityLabel="Назад"
            style={({ pressed }) => [styles.backButton, pressed && styles.backButtonPressed]}
            onPress={onPress}
        >
            <BackArrowIcon />
        </Pressable>
    );
}

//Заголовок приложения
function AppHeader({
    title,
    subtitle,
    showMenuButton = true,
    onMenuPress,
    showModeIndicator = true,
    showBackButton = false,
    onBackPress
}) {
    const { mode } = useAppModeContext();
    const { currentScreen, SCREENS } = useAppNavigationContext();
    const { showInfo } = useAppMessagingContext();

    //Получение заголовка экрана
    const getTitle = React.useCallback(() => {
        if (title) return title;

        switch (currentScreen) {
            case SCREENS.MAIN:
                return 'Парус© Предрейсовые осмотры';
            case SCREENS.SETTINGS:
                return 'Настройки';
            default:
                return 'Парус© Предрейсовые осмотры';
        }
    }, [title, currentScreen, SCREENS.MAIN, SCREENS.SETTINGS]);

    //Получение подзаголовка экрана
    const getSubtitle = React.useCallback(() => {
        if (subtitle) return subtitle;

        switch (currentScreen) {
            case SCREENS.MAIN:
                return mode === 'NOT_CONNECTED' ? 'Требуется настройка сервера' : 'Демонстрационный экран';
            case SCREENS.SETTINGS:
                return 'Конфигурация приложения';
            default:
                return '';
        }
    }, [subtitle, currentScreen, mode, SCREENS.MAIN, SCREENS.SETTINGS]);

    //Обработчик нажатия на индикатор режима (универсальный для всех экранов)
    const handleModeIndicatorPress = React.useCallback(() => {
        const modeLabel = getModeLabel(mode);
        const modeDescription = getModeDescription(mode);

        showInfo(`Текущий режим: ${modeLabel}`, {
            message: modeDescription
        });
    }, [mode, showInfo]);

    //Отрисовка левой части шапки (логотип или кнопка назад)
    const renderLeftSection = () => {
        if (showBackButton) {
            return <BackButton onPress={onBackPress} />;
        }

        return <AppLogo size="small" style={styles.logo} />;
    };

    return (
        <View style={styles.container}>
            <View style={styles.content}>
                {renderLeftSection()}

                <View style={styles.titleContainer}>
                    <AppText style={styles.title} numberOfLines={1}>
                        {getTitle()}
                    </AppText>
                    {getSubtitle() ? (
                        <AppText style={styles.subtitle} numberOfLines={1}>
                            {getSubtitle()}
                        </AppText>
                    ) : null}
                </View>

                <View style={styles.controls}>
                    {showModeIndicator ? <ModeIndicator mode={mode} onPress={handleModeIndicatorPress} /> : null}

                    {showMenuButton ? (
                        <Pressable style={({ pressed }) => [styles.menuButton, pressed && styles.menuButtonPressed]} onPress={onMenuPress}>
                            <View style={styles.menuButtonIcon}>
                                <View style={styles.menuButtonIconLine} />
                                <View style={styles.menuButtonIconLine} />
                                <View style={styles.menuButtonIconLine} />
                            </View>
                        </Pressable>
                    ) : null}
                </View>
            </View>
        </View>
    );
}

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

module.exports = AppHeader;
