import Foundation
import ScanbotSDK
import ScanbotSDKNativeWrapper

@objc public protocol RNScanbotBarcodeScannerEventDelegate {

    @objc func onScannedBarcode(_ barcode: String)

    @objc func onSelectedBarcode(_ barcode: String)

    @objc func onError(_ errorMessage: String, errorCode: Int)

}

extension RNScanbotBarcodeScannerEventDelegate {
    
    func onError(error: SBError){
        onError(error.localizedDescription, errorCode: error.errorCode)
    }
}

struct RNScanbotBarcodeScannerDefaults {
    let hardwareButtonsEnabled = true
    // Finder Config
    let finderStrokeWidth = CGFloat(2)
    let finderStrokeColor = SBComponentUtils.fromRgbAHex("#ffffffff")
    let finderOverlayColor = SBComponentUtils.fromRgbAHex("#000000A9")
    let finderInset = UIEdgeInsets(top: 10,left: 10,bottom: 10,right: 10)
    let finderAspectRatio = SBSDKAspectRatio(width: 4, height: 3)
    // Camera Config
    let cameraZoomRange = SBSDKZoomRange(minZoom: 1, maxZoom: 12)
    let cameraZoomFactor = 0.0
    // Overlay Config
    let overlayPolygonColor = SBComponentUtils.fromRgbAHex("#00CFA633")
    let overlayStrokeColor = SBComponentUtils.fromRgbAHex("#00CFA6CC")
    let overlayTextColor = SBComponentUtils.fromRgbAHex("#000000")
    let overlayTextContainerColor = SBComponentUtils.fromRgbAHex("#00CFA6CC")
    let overlayTextFormat: SBSDKBarcodeOverlayFormat = .codeAndType
    // Barcode Config
    let configFormatConfigurations: [SBSDKBarcodeFormatConfigurationBase] = []
    let configExtractedDocumentFormats: [SBSDKBarcodeDocumentFormat] = SBSDKBarcodeDocumentFormats.all
    let configEngineMode = SBSDKBarcodeScannerEngineMode.nextGen
    let configAccumulationConfigTime: Int = 100
    let configAccumulationConfigRemoveUnconnectedResults: Bool = false
    let configAccumulationConfigMethod: NSString = "interpolateByCamera"
}

struct BarcodeItemOverlayViewConfig: Decodable {
    let text: String?
    let textColor: String?
    let textContainerColor: String?
    let polygonColor: String?
    let strokeColor: String?
    let refreshRate: Double?
    var lastBind: Double?

    init(
        text: String?,
        textColor: String? = nil,
        textContainerColor: String? = nil,
        polygonColor: String? = nil,
        strokeColor: String? = nil,
        refreshRate: Double? = nil,
        lastBind: Double? = nil
    ) {
        self.text = text
        self.textColor = textColor
        self.textContainerColor = textContainerColor
        self.polygonColor = polygonColor
        self.strokeColor = strokeColor
        self.refreshRate = refreshRate
        self.lastBind = lastBind
    }
}
