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

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

const React = require('react');
const { ScrollView, View, Pressable } = require('react-native');
const AdaptiveView = require('../components/common/AdaptiveView');
const AppText = require('../components/common/AppText');
const AppButton = require('../components/common/AppButton');
const CopyButton = require('../components/common/CopyButton');
const InputDialog = require('../components/common/InputDialog');
const AppHeader = require('../components/layout/AppHeader');
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 { APP_COLORS } = require('../config/theme');
const { getAppInfo, getModeLabel } = require('../utils/appInfo');
const styles = require('../styles/screens/SettingsScreen.styles');

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

function SettingsScreen() {
    const { showInfo, showError, showSuccess } = useAppMessagingContext();
    const { mode, setOnline, setNotConnected } = useAppModeContext();
    const { goBack, canGoBack } = useAppNavigationContext();
    const { getSetting, setSetting, clearSettings, clearInspections, vacuum, isDbReady } = useAppLocalDbContext();

    const [serverUrl, setServerUrl] = React.useState('');
    const [isLoading, setIsLoading] = React.useState(false);
    const [isServerUrlDialogVisible, setIsServerUrlDialogVisible] = React.useState(false);

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

    //Загрузка сохраненного URL сервера при готовности БД
    React.useEffect(() => {
        //Выходим, если БД не готова или уже загрузили настройки
        if (!isDbReady || settingsLoadedRef.current) {
            return;
        }

        settingsLoadedRef.current = true;

        const loadSettings = async () => {
            setIsLoading(true);
            try {
                const savedUrl = await getSetting('app_server_url');
                if (savedUrl) {
                    setServerUrl(savedUrl);
                }
            } catch (error) {
                console.error('Ошибка загрузки настроек:', error);
                showError('Не удалось загрузить настройки');
            } finally {
                setIsLoading(false);
            }
        };

        loadSettings();
    }, [isDbReady, getSetting, showError]);

    //Открытие диалога ввода URL сервера
    const handleOpenServerUrlDialog = React.useCallback(() => {
        setIsServerUrlDialogVisible(true);
    }, []);

    //Закрытие диалога ввода URL сервера
    const handleCloseServerUrlDialog = React.useCallback(() => {
        setIsServerUrlDialogVisible(false);
    }, []);

    //Валидатор URL сервера
    const validateServerUrl = React.useCallback(url => {
        if (!url || !url.trim()) {
            return 'Введите адрес сервера';
        }

        try {
            const parsedUrl = new URL(url.trim());
            if (!parsedUrl.protocol.startsWith('http')) {
                return 'Используйте http:// или https:// протокол';
            }
        } catch (error) {
            return 'Некорректный формат URL';
        }

        return true;
    }, []);

    //Сохранение настроек сервера
    const handleSaveServerUrl = React.useCallback(
        async url => {
            setIsServerUrlDialogVisible(false);
            setIsLoading(true);

            try {
                const success = await setSetting('app_server_url', url);

                if (success) {
                    setServerUrl(url);
                    showSuccess('Настройки сервера сохранены');

                    if (mode === 'NOT_CONNECTED') {
                        setOnline();
                    }
                } else {
                    showError('Не удалось сохранить настройки');
                }
            } catch (error) {
                console.error('Ошибка сохранения настроек:', error);
                showError('Не удалось сохранить настройки');
            }

            setIsLoading(false);
        },
        [mode, setOnline, setSetting, showError, showSuccess]
    );

    //Очистка кэша (осмотров)
    const handleClearCache = React.useCallback(async () => {
        showInfo('Очистить кэш приложения?', {
            title: 'Подтверждение',
            buttons: [
                {
                    id: 'cancel',
                    title: 'Отмена',
                    onPress: () => { }
                },
                {
                    id: 'confirm',
                    title: 'Очистить',
                    onPress: async () => {
                        try {
                            const success = await clearInspections();
                            if (success) {
                                showSuccess('Кэш успешно очищен');
                            } else {
                                showError('Не удалось очистить кэш');
                            }
                        } catch (error) {
                            console.error('Ошибка очистки кэша:', error);
                            showError('Не удалось очистить кэш');
                        }
                    },
                    buttonStyle: { backgroundColor: APP_COLORS.error },
                    textStyle: { color: APP_COLORS.white }
                }
            ]
        });
    }, [showInfo, showSuccess, showError, clearInspections]);

    //Сброс всех настроек
    const handleResetSettings = React.useCallback(async () => {
        showInfo('Сбросить все настройки к значениям по умолчанию?', {
            title: 'Подтверждение сброса',
            buttons: [
                {
                    id: 'cancel',
                    title: 'Отмена',
                    onPress: () => { }
                },
                {
                    id: 'confirm',
                    title: 'Сбросить',
                    onPress: async () => {
                        try {
                            const success = await clearSettings();
                            if (success) {
                                setServerUrl('');
                                setNotConnected();
                                showSuccess('Настройки сброшены');
                            } else {
                                showError('Не удалось сбросить настройки');
                            }
                        } catch (error) {
                            console.error('Ошибка сброса настроек:', error);
                            showError('Не удалось сбросить настройки');
                        }
                    },
                    buttonStyle: { backgroundColor: APP_COLORS.warning },
                    textStyle: { color: APP_COLORS.white }
                }
            ]
        });
    }, [showInfo, showSuccess, showError, setNotConnected, clearSettings]);

    //Оптимизация базы данных
    const handleOptimizeDb = React.useCallback(async () => {
        setIsLoading(true);
        try {
            const success = await vacuum();
            if (success) {
                showSuccess('База данных оптимизирована');
            } else {
                showError('Не удалось оптимизировать базу данных');
            }
        } catch (error) {
            console.error('Ошибка оптимизации БД:', error);
            showError('Не удалось оптимизировать базу данных');
        } finally {
            setIsLoading(false);
        }
    }, [vacuum, showSuccess, showError]);

    //Информация о приложении
    const handleShowAppInfo = React.useCallback(() => {
        const appInfo = getAppInfo({
            mode,
            serverUrl,
            isDbReady
        });

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

    //Обработчик кнопки назад
    const handleBackPress = React.useCallback(() => {
        if (canGoBack) {
            goBack();
        }
    }, [canGoBack, goBack]);

    //Обработчик копирования адреса сервера
    const handleCopyServerUrl = React.useCallback(() => {
        showSuccess('Адрес сервера скопирован');
    }, [showSuccess]);

    //Обработчик ошибки копирования
    const handleCopyError = React.useCallback(() => {
        showError('Не удалось скопировать адрес');
    }, [showError]);

    return (
        <AdaptiveView padding={false}>
            <AppHeader showBackButton={true} onBackPress={handleBackPress} showMenuButton={false} />

            <ScrollView style={styles.scrollView} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
                <View style={styles.section}>
                    <AppText style={styles.sectionTitle} variant="h3" weight="semibold">
                        Сервер приложений
                    </AppText>

                    <AppText style={styles.fieldLabel} variant="caption" weight="medium">
                        URL сервера
                    </AppText>

                    <View style={styles.serverUrlRow}>
                        <Pressable
                            style={({ pressed }) => [styles.serverUrlField, pressed && styles.serverUrlFieldPressed]}
                            onPress={handleOpenServerUrlDialog}
                            disabled={isLoading || !isDbReady}
                        >
                            <AppText
                                style={[styles.serverUrlText, !serverUrl && styles.serverUrlPlaceholder]}
                                numberOfLines={1}
                            >
                                {serverUrl || 'Нажмите для ввода адреса'}
                            </AppText>
                        </Pressable>

                        {serverUrl ? (
                            <CopyButton
                                value={serverUrl}
                                onCopy={handleCopyServerUrl}
                                onError={handleCopyError}
                                style={styles.serverUrlCopyButton}
                            />
                        ) : null}
                    </View>
                </View>

                <View style={styles.section}>
                    <AppText style={styles.sectionTitle} variant="h3" weight="semibold">
                        Управление данными
                    </AppText>

                    <AppButton
                        title="Очистить кэш"
                        onPress={handleClearCache}
                        disabled={!isDbReady}
                        style={[styles.actionButton, styles.clearCacheButton]}
                        textStyle={styles.clearCacheButtonText}
                    />

                    <AppButton
                        title="Сбросить настройки"
                        onPress={handleResetSettings}
                        disabled={!isDbReady}
                        style={[styles.actionButton, styles.resetButton]}
                        textStyle={styles.resetButtonText}
                    />

                    <AppButton
                        title="Оптимизировать БД"
                        onPress={handleOptimizeDb}
                        disabled={isLoading || !isDbReady}
                        style={[styles.actionButton, styles.optimizeButton]}
                        textStyle={styles.optimizeButtonText}
                    />
                </View>

                <View style={styles.section}>
                    <AppText style={styles.sectionTitle} variant="h3" weight="semibold">
                        Информация
                    </AppText>

                    <AppButton title="О приложении" onPress={handleShowAppInfo} style={[styles.actionButton, styles.infoButton]} />

                    <View style={styles.infoRow}>
                        <AppText style={styles.infoLabel} variant="body">
                            Текущий режим:
                        </AppText>
                        <AppText style={styles.infoValue} variant="body" weight="medium">
                            {getModeLabel(mode)}
                        </AppText>
                    </View>

                    <View style={styles.infoRow}>
                        <AppText style={styles.infoLabel} variant="body">
                            Адрес сервера:
                        </AppText>
                        <View style={styles.infoValueWithAction}>
                            <AppText style={styles.infoValueFlex} variant="body" weight="medium" numberOfLines={1}>
                                {serverUrl || 'Не настроен'}
                            </AppText>
                            {serverUrl ? (
                                <CopyButton
                                    value={serverUrl}
                                    onCopy={handleCopyServerUrl}
                                    onError={handleCopyError}
                                    style={styles.copyButton}
                                />
                            ) : null}
                        </View>
                    </View>

                    <View style={styles.infoRow}>
                        <AppText style={styles.infoLabel} variant="body">
                            База данных:
                        </AppText>
                        <AppText style={styles.infoValue} variant="body" weight="medium">
                            {isDbReady ? 'Готова' : 'Загрузка...'}
                        </AppText>
                    </View>
                </View>
            </ScrollView>

            <InputDialog
                visible={isServerUrlDialogVisible}
                title="Адрес сервера"
                label="URL сервера приложений"
                value={serverUrl}
                placeholder="https://example.com/api"
                keyboardType="url"
                confirmText="Сохранить"
                cancelText="Отмена"
                onConfirm={handleSaveServerUrl}
                onCancel={handleCloseServerUrlDialog}
                validator={validateServerUrl}
            />
        </AdaptiveView>
    );
}

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

module.exports = SettingsScreen;
