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

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

const React = require('react'); //React и хуки
const { Modal, View, Text, Pressable } = require('react-native'); //Базовые компоненты
const { APP_MESSAGE_VARIANT } = require('../../config/messagingConfig'); //Типы сообщений
const styles = require('../../styles/common/AppMessage.styles'); //Стили сообщения

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

//Стиль кнопки сообщения при нажатии
function getMessageButtonPressableStyle(stylesRef, buttonStyle) {
    return function styleFn({ pressed }) {
        return [stylesRef.buttonBase, pressed && stylesRef.buttonPressed, buttonStyle];
    };
}

//Кнопка сообщения
function AppMessageButton({ title, onPress, onDismiss, buttonStyle, textStyle }) {
    //Обработчик нажатия - вызывает onPress и закрывает диалог
    const handlePress = React.useCallback(() => {
        //Сначала закрываем диалог
        if (typeof onDismiss === 'function') {
            onDismiss();
        }

        //Затем выполняем действие кнопки
        if (typeof onPress === 'function') {
            onPress();
        }
    }, [onPress, onDismiss]);

    const getPressableStyle = React.useMemo(() => getMessageButtonPressableStyle(styles, buttonStyle), [buttonStyle]);

    return (
        <Pressable style={getPressableStyle} onPress={handlePress}>
            <Text style={[styles.buttonText, textStyle]}>{title}</Text>
        </Pressable>
    );
}

//Сообщение приложения
function AppMessage({
    visible,
    variant = APP_MESSAGE_VARIANT.INFO,
    title,
    message,
    //Кнопки: массив объектов { id, title, onPress, buttonStyle, textStyle }
    buttons,
    //Обработчик закрытия по "крестику" или по системному Back на Android
    onRequestClose,
    //Кастомизация стилей контейнера и содержимого
    containerStyle,
    contentStyle,
    titleStyle,
    messageStyle,
    headerStyle
}) {
    //Флаг наличия кнопок
    const hasButtons = Array.isArray(buttons) && buttons.length > 0;

    //Подбор варианта оформления по типу сообщения
    const containerVariantStyle =
        variant === APP_MESSAGE_VARIANT.ERR
            ? styles.containerError
            : variant === APP_MESSAGE_VARIANT.WARN
            ? styles.containerWarn
            : variant === APP_MESSAGE_VARIANT.SUCCESS
            ? styles.containerSuccess
            : styles.containerInfo;

    //Обработчик закрытия
    const handleClose = React.useCallback(() => {
        if (typeof onRequestClose === 'function') onRequestClose();
    }, [onRequestClose]);

    return (
        <Modal animationType="fade" transparent={true} visible={!!visible} onRequestClose={handleClose}>
            <View style={styles.backdrop}>
                <View style={[styles.container, containerVariantStyle, containerStyle]}>
                    <View style={[styles.header, headerStyle]}>
                        <Text style={[styles.title, titleStyle]}>{title || ''}</Text>
                        <Pressable accessibilityRole="button" accessibilityLabel="Закрыть сообщение" onPress={handleClose} style={styles.closeButton}>
                            <Text style={styles.closeButtonText}>×</Text>
                        </Pressable>
                    </View>
                    <View style={[styles.content, contentStyle]}>
                        <Text style={[styles.message, messageStyle]}>{message}</Text>
                    </View>
                    {hasButtons ? (
                        <View style={styles.buttonsRow}>
                            {buttons.map(btn => (
                                <AppMessageButton
                                    key={btn.id || btn.title}
                                    title={btn.title}
                                    onPress={btn.onPress}
                                    onDismiss={handleClose}
                                    buttonStyle={btn.buttonStyle}
                                    textStyle={btn.textStyle}
                                />
                            ))}
                        </View>
                    ) : null}
                </View>
            </View>
        </Modal>
    );
}

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

module.exports = {
    AppMessage,
    APP_MESSAGE_VARIANT
};
