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

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

const React = require('react'); //React
const { View } = require('react-native'); //Базовые компоненты
const AppText = require('../common/AppText'); //Текстовый компонент
const AppButton = require('../common/AppButton'); //Кнопка
const styles = require('../../styles/layout/AppErrorBoundary.styles'); //Стили компонента

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

//Обработчик перезагрузки приложения
function handleErrorReload(onReload) {
    if (typeof onReload === 'function') {
        onReload();
        return;
    }
    if (typeof window !== 'undefined' && window.location && typeof window.location.reload === 'function') {
        window.location.reload();
    }
}

//Компонент страницы ошибки
function AppErrorPage({ error, onReload }) {
    const message = error && error.message ? String(error.message) : 'Произошла непредвиденная ошибка приложения.';

    const handleReload = React.useCallback(() => {
        handleErrorReload(onReload);
    }, [onReload]);

    return (
        <View style={styles.container}>
            <View style={styles.card}>
                <AppText style={styles.title}>Ошибка приложения</AppText>
                <AppText style={styles.message}>{message}</AppText>
                <View style={styles.buttonRow}>
                    <AppButton title="Перезапустить" onPress={handleReload} />
                </View>
            </View>
        </View>
    );
}

//Классический Error Boundary
class AppErrorBoundary extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            hasError: false,
            error: null
        };
    }

    static getDerivedStateFromError(error) {
        return {
            hasError: true,
            error
        };
    }

    componentDidCatch(error, info) {
        //TODO: логгер
    }

    handleReset = () => {
        this.setState({
            hasError: false,
            error: null
        });
    };

    render() {
        if (this.state.hasError) {
            return <AppErrorPage error={this.state.error} onReload={this.handleReset} />;
        }
        return this.props.children;
    }
}

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

module.exports = AppErrorBoundary;
