#if !defined(RCT_NEW_ARCH_ENABLED)

#import <React/RCTViewManager.h>
#import <React/RCTUIManager.h>

#import "RNScanbotBarcodeScannerLegacyView.h"

typedef void (^NativeViewBlock)(RNScanbotBarcodeScannerLegacyView* _Nonnull);

@interface RNScanbotBarcodeScannerViewManager: RCTViewManager
@end

@implementation RNScanbotBarcodeScannerViewManager

RCT_EXPORT_MODULE(ScanbotBarcodeScannerView)

- (UIView *)view {
    return [[RNScanbotBarcodeScannerLegacyView alloc] init];
}

// Events
RCT_EXPORT_VIEW_PROPERTY(onBarcodeScannerResult, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onSelectBarcodeResult, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
// General Configuration
RCT_EXPORT_VIEW_PROPERTY(flashEnabled, BOOL)
RCT_EXPORT_VIEW_PROPERTY(scanningEnabled, BOOL)
RCT_EXPORT_VIEW_PROPERTY(hardwareButtonsEnabled, BOOL)
// Finder Configuration
RCT_EXPORT_VIEW_PROPERTY(finderEnabled, BOOL)
RCT_EXPORT_VIEW_PROPERTY(finderStrokeWidth, NSNumber)
RCT_EXPORT_VIEW_PROPERTY(finderStrokeColor, UIColor)
RCT_EXPORT_VIEW_PROPERTY(finderOverlayColor, UIColor)
//RCT_EXPORT_VIEW_PROPERTY(finderMinPadding, NSNumber)
RCT_EXPORT_VIEW_PROPERTY(finderInset, NSDictionary)
RCT_EXPORT_VIEW_PROPERTY(finderRequiredAspectRatios, NSDictionary)
// Camera Configuration
RCT_EXPORT_VIEW_PROPERTY(cameraZoomFactor, NSNumber)
RCT_EXPORT_VIEW_PROPERTY(cameraZoomRange, NSDictionary)
RCT_EXPORT_VIEW_PROPERTY(cameraModule, NSString)
RCT_EXPORT_VIEW_PROPERTY(minFocusDistanceLock, BOOL)
// Overlay Configuration
RCT_EXPORT_VIEW_PROPERTY(overlayEnabled, BOOL)
RCT_EXPORT_VIEW_PROPERTY(overlayPolygonColor, UIColor)
RCT_EXPORT_VIEW_PROPERTY(overlayStrokeColor, UIColor)
RCT_EXPORT_VIEW_PROPERTY(overlayTextColor, UIColor)
RCT_EXPORT_VIEW_PROPERTY(overlayTextContainerColor, UIColor)
RCT_EXPORT_VIEW_PROPERTY(overlayTextFormat, NSString)
RCT_EXPORT_VIEW_PROPERTY(overlayLoadingTextValue, NSString)
RCT_EXPORT_VIEW_PROPERTY(overlayBarcodeItemOverlayViewBinder, BOOL)
// Barcode Configuration
RCT_EXPORT_VIEW_PROPERTY(configFormatConfigurations, NSArray)
RCT_EXPORT_VIEW_PROPERTY(configExtractedDocumentFormats, NSArray)
RCT_EXPORT_VIEW_PROPERTY(configOnlyAcceptDocuments, BOOL)
RCT_EXPORT_VIEW_PROPERTY(configReturnBarcodeImage, BOOL)
RCT_EXPORT_VIEW_PROPERTY(configEngineMode, NSString)
RCT_EXPORT_VIEW_PROPERTY(configOptimizedForOverlays, BOOL)
RCT_EXPORT_VIEW_PROPERTY(configAccumulation, NSDictionary)

//Commands
RCT_EXPORT_METHOD(freezeCamera:(nonnull NSNumber*) reactTag) {
    [self callNativeMethodWithReactTag: reactTag andBlock: ^void (RNScanbotBarcodeScannerLegacyView *nativeView) {
        [nativeView freezeCamera];
    }];
}

RCT_EXPORT_METHOD(unfreezeCamera:(nonnull NSNumber*) reactTag) {
    [self callNativeMethodWithReactTag: reactTag andBlock: ^void (RNScanbotBarcodeScannerLegacyView *nativeView) {
        [nativeView unfreezeCamera];
    }];
}

RCT_EXPORT_METHOD(bindBarcodeItemOverlayView:(nonnull NSNumber*) reactTag
                  barcode:(nonnull NSString *)barcodeItemUuid binding:(nonnull NSString *)bindingConfigJson) {
    [self callNativeMethodWithReactTag: reactTag andBlock: ^void (RNScanbotBarcodeScannerLegacyView *nativeView) {
        [nativeView bindBarcodeItemOverlayView:barcodeItemUuid bindingConfig:bindingConfigJson];
    }];
}

- (void) callNativeMethodWithReactTag:(nonnull NSNumber*) reactTag andBlock:(NativeViewBlock)block {
    [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
        RNScanbotBarcodeScannerLegacyView *view = (RNScanbotBarcodeScannerLegacyView *) viewRegistry[reactTag];
        if (!view || ![view isKindOfClass:[RNScanbotBarcodeScannerLegacyView class]]) {
            RCTLogError(@"Cannot find native view with tag #%@", reactTag);
            return;
        }
        block(view);
    }];
}

@end

#endif
