/*
    Предрейсовые осмотры - мобильное приложение
    Область сканера на главном экране: всегда активный сканер или заглушка с кнопкой
*/

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

const React = require('react'); //React
const { View, Modal, Pressable, Platform } = require('react-native'); //Базовые компоненты
const BarcodeScanner = require('./BarcodeScanner'); //Сканер
const ScannerPlaceholder = require('./ScannerPlaceholder'); //Заглушка с кнопкой
const CameraPausedOverlay = require('./CameraPausedOverlay'); //Оверлей «камера на паузе»
const AppText = require('../common/AppText'); //Текст
const { SCANNER_CAMERA_TAP_TO_RESUME } = require('../../config/messages'); //Сообщения
const styles = require('../../styles/scanner/ScannerArea.styles'); //Стили области

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

//Обработчик успешного сканирования: передаём результат наружу и при необходимости закрываем модал
function handleScanResult(result, onScanResult, closeModal) {
    if (typeof onScanResult === 'function') {
        onScanResult(result);
    }
    if (typeof closeModal === 'function') {
        closeModal();
    }
}

//Область сканера: при включённой настройке — активный сканер (если открыт), иначе заглушка и модальный сканер по кнопке
function ScannerArea({
    alwaysShowScanner = false,
    scannerOpen = true,
    cameraActive = true,
    onScanResult,
    onResumeCameraPress,
    placeholderHint,
    placeholderSecondaryLabel,
    placeholderSecondaryOnPress
}) {
    const [scannerModalVisible, setScannerModalVisible] = React.useState(false);

    const handleScanFromArea = React.useCallback(
        result => {
            handleScanResult(result, onScanResult, null);
        },
        [onScanResult]
    );

    const handleScanFromModal = React.useCallback(
        result => {
            handleScanResult(result, onScanResult, () => setScannerModalVisible(false));
        },
        [onScanResult]
    );

    const handleOpenScanner = React.useCallback(() => {
        setScannerModalVisible(true);
    }, []);

    const handleCloseScannerModal = React.useCallback(() => {
        setScannerModalVisible(false);
    }, []);

    const renderScannerContent = () => {
        if (alwaysShowScanner && scannerOpen) {
            const wrapperProps = Platform.OS === 'android' ? { focusable: false, importantForAccessibility: 'no-hide-descendants' } : {};
            const showPausedOverlay = !cameraActive && typeof onResumeCameraPress === 'function';
            return (
                <View style={styles.scannerWrapper} {...wrapperProps}>
                    <BarcodeScanner isActive={cameraActive} onScan={handleScanFromArea} />
                    {showPausedOverlay ? (
                        <Pressable
                            style={styles.cameraPausedOverlayTouchable}
                            onPress={onResumeCameraPress}
                            accessibilityRole="button"
                            accessibilityLabel="Включить камеру"
                            {...(Platform.OS === 'android' ? { focusable: false } : {})}
                        >
                            <CameraPausedOverlay message={SCANNER_CAMERA_TAP_TO_RESUME} />
                        </Pressable>
                    ) : null}
                </View>
            );
        }
        return (
            <ScannerPlaceholder
                onScanPress={handleOpenScanner}
                hintText={placeholderHint}
                secondaryButtonTitle={placeholderSecondaryLabel}
                secondaryButtonOnPress={placeholderSecondaryOnPress}
            />
        );
    };

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

            <Modal visible={scannerModalVisible} animationType="slide" onRequestClose={handleCloseScannerModal}>
                <View style={styles.modalContainer}>
                    <BarcodeScanner isActive={scannerModalVisible} onScan={handleScanFromModal} />
                    <Pressable
                        style={styles.modalCloseButton}
                        onPress={handleCloseScannerModal}
                        accessibilityRole="button"
                        accessibilityLabel="Закрыть сканер"
                    >
                        <AppText style={styles.modalCloseButtonText}>Закрыть</AppText>
                    </Pressable>
                </View>
            </Modal>
        </View>
    );
}

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

module.exports = ScannerArea;
