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

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

const React = require('react'); //React и хуки
const { View, Platform } = require('react-native'); //Базовые компоненты
const { Camera, useCameraDevice, useCodeScanner, useCameraPermission } = require('react-native-vision-camera'); //Камера и сканер кодов
const AppText = require('../common/AppText'); //Общий текст
const { DEFAULT_CODE_TYPES } = require('../../config/scannerConfig'); //Конфиг сканера
const styles = require('../../styles/scanner/BarcodeScanner.styles'); //Стили сканера

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

//Текст при отсутствии разрешения на камеру
const PERMISSION_DENIED_MESSAGE = 'Для сканирования разрешите доступ к камере в настройках приложения';

//Текст при отсутствии устройства камеры
const NO_CAMERA_MESSAGE = 'Камера недоступна';

//Обработка отсканированных кодов
function createCodeScannedHandler(onScan, lastScannedRef) {
    return function onCodeScanned(codes) {
        if (!codes || codes.length === 0 || typeof onScan !== 'function') {
            return;
        }
        const code = codes[0];
        const value = code.value;
        if (value == null || value === '') {
            return;
        }
        if (lastScannedRef.current === value) {
            return;
        }
        lastScannedRef.current = value;
        onScan({ type: code.type || 'unknown', value });
    };
}

//Сканер штрихкодов и QR (нативная камера)
function BarcodeScannerNative({ onScan, isActive = true }) {
    const device = useCameraDevice('back');
    const { hasPermission, requestPermission } = useCameraPermission();
    const lastScannedRef = React.useRef(null);

    const onCodeScannedCallback = React.useCallback(
        codes => {
            createCodeScannedHandler(onScan, lastScannedRef)(codes);
        },
        [onScan]
    );

    const codeScanner = useCodeScanner({
        codeTypes: DEFAULT_CODE_TYPES,
        onCodeScanned: onCodeScannedCallback
    });

    //Запрос разрешения при монтировании
    React.useEffect(() => {
        if (hasPermission === false && typeof requestPermission === 'function') {
            requestPermission();
        }
    }, [hasPermission, requestPermission]);

    const noFocusProps = Platform.OS === 'android' ? { focusable: false } : {};

    //Нет устройства камеры
    if (device == null) {
        return (
            <View style={styles.fallbackContainer} {...noFocusProps}>
                <AppText style={styles.fallbackText} variant="body">
                    {NO_CAMERA_MESSAGE}
                </AppText>
            </View>
        );
    }

    //Нет разрешения на камеру
    if (!hasPermission) {
        return (
            <View style={styles.fallbackContainer} {...noFocusProps}>
                <AppText style={styles.fallbackText} variant="body">
                    {PERMISSION_DENIED_MESSAGE}
                </AppText>
            </View>
        );
    }

    const containerProps = Platform.OS === 'android' ? { focusable: false, importantForAccessibility: 'no-hide-descendants' } : {};

    return (
        <View style={styles.container} {...containerProps}>
            <Camera style={styles.camera} device={device} isActive={isActive} codeScanner={codeScanner} />
        </View>
    );
}

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

module.exports = BarcodeScannerNative;
