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

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

const { NativeModules, Platform, DeviceEventEmitter } = require('react-native');
const { HARDWARE_SCANNER_EVENT_NAME } = require('../config/scannerConfig');

//---------
//Состояние
//---------

let hardwareCallback = null;
let isListening = false;

const { HardwareScannerModule } = NativeModules;

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

//Доставка данных в колбэк в следующем тике (данные как есть, без обрезки)
function deliverBarcode(barcode) {
    if (!isListening || !hardwareCallback) return;
    const s = typeof barcode === 'string' ? barcode : '';
    if (s.length === 0) return;
    setTimeout(function deliverNextTick() {
        if (!isListening || !hardwareCallback) return;
        try {
            hardwareCallback(s);
        } catch (_err) {}
    }, 0);
}

//Запуск прослушивания встроенного сканера (событие по мосту); возвращает функцию отписки
function startHardwareListener(onData) {
    if (Platform.OS !== 'android') return function noopUnsubscribe() {};
    if (!HardwareScannerModule) return function noopUnsubscribe() {};
    if (typeof onData !== 'function') return function noopUnsubscribe() {};
    if (isListening && hardwareCallback) return function noopUnsubscribe() {};

    hardwareCallback = onData;
    isListening = true;

    const subscription = DeviceEventEmitter.addListener(HARDWARE_SCANNER_EVENT_NAME, function onBarcodeEvent(event) {
        const barcode = event && event.barcode != null ? String(event.barcode) : '';
        deliverBarcode(barcode);
    });

    return function unsubscribe() {
        isListening = false;
        if (subscription && typeof subscription.remove === 'function') subscription.remove();
        hardwareCallback = null;
    };
}

//Отключить фокус у видов камеры в иерархии, чтобы встроенный сканер получал клавиши при отображении камеры (только Android)
function setCameraViewsNotFocusable() {
    if (Platform.OS !== 'android' || !HardwareScannerModule) return;
    try {
        if (typeof HardwareScannerModule.setCameraViewsNotFocusable === 'function') {
            HardwareScannerModule.setCameraViewsNotFocusable();
        }
    } catch (_) {}
}

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

module.exports = {
    startHardwareListener,
    setCameraViewsNotFocusable
};
