//
//  ScanbotSDKCapacitorPlugin.swift
//  Plugin
//
//  Copyright © 2024 Scanbot SDK GmbH. All rights reserved.
//

import Capacitor
import ScanbotSDKNativeWrapper

@objc(ScanbotSDKCapacitorPlugin)
public class ScanbotSDKCapacitorPlugin: CAPPlugin, CAPBridgedPlugin {
  
  // MARK: - Methods from CAPBridgedPlugin. We use this protocol to avoid creating .h and .m files for exporting swift to objc
  public var identifier: String = "ScanbotSDKCapacitorPlugin"
  
  public var jsName: String = "ScanbotSDKCapacitor"
  
  // Need to define all methods here to be available for the Capacitor web runtime
  public var pluginMethods: [CAPPluginMethod] = [
    /* SDK OPERATIONS */
    CAPPluginMethod(name: "initialize", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "getLicenseInfo", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "getOcrConfigs", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "cleanupStorage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "setAnalyticsServiceCallback", returnType: CAPPluginReturnCallback),
    CAPPluginMethod(name: "removeAnalyticsServiceCallback", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "mockCamera", returnType: CAPPluginReturnPromise),
    /* BARCODE OPERATIONS */
    CAPPluginMethod(name: "scanBarcodesFromImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "scanBarcodesFromPdf", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startBarcodeScanner", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "parseBarcodeDocument", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "registerBarcodeItemMapperCallback", returnType: CAPPluginReturnNone),
    CAPPluginMethod(name: "onBarcodeItemMapper", returnType: CAPPluginReturnNone),
    /* CHECK OPERATIONS */
    CAPPluginMethod(name: "scanCheckFromImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startCheckScanner", returnType: CAPPluginReturnPromise),
    /* CREDIT CARD OPERATIONS */
    CAPPluginMethod(name: "scanCreditCardFromImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startCreditCardScanner", returnType: CAPPluginReturnPromise),
    /* DOCUMENT OPERATIONS */
    CAPPluginMethod(name: "createDocumentFromImages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "createDocumentFromLegacyPages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "createDocumentFromPdf", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "documentExists", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "loadDocument", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "getStoredDocumentUuids", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "cloneDocument", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "deleteDocument", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "deleteAllDocuments", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "addPages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "movePage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "modifyPage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "removePagesFromDocument", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "removeAllPages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "scanDocumentFromImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "analyzeDocumentQualityOnImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startDocumentScanner", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startCroppingScreen", returnType: CAPPluginReturnPromise),
    /* LEGACY PAGE OPERATIONS */
    CAPPluginMethod(name: "removeLegacyPage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "removeAllLegacyPages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "setDocumentImageOnLegacyPage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "refreshImageUrisOnLegacyPage", returnType: CAPPluginReturnPromise),
    /* DDE OPERATIONS */
    CAPPluginMethod(name: "extractDocumentDataFromImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "verifyDocument", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startDDEScreen", returnType: CAPPluginReturnPromise),
    /* IMAGE PROCESSOR OPERATIONS */
    CAPPluginMethod(name: "readImageData", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "rotateImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "rotateImageFile", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "applyFiltersOnImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "applyFiltersOnImageFile", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "resizeImageFile", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "resizeImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "cropImageFile", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "cropImage", returnType: CAPPluginReturnPromise),
    /* MRZ OPERATIONS */
    CAPPluginMethod(name: "scanMrzFromImage", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "startMrzScanner", returnType: CAPPluginReturnPromise),
    /* TEXT PATTERN OPERATIONS */
    CAPPluginMethod(name: "startTextPatternScanner", returnType: CAPPluginReturnPromise),
    /* VIN OPERATIONS */
    CAPPluginMethod(name: "startVinScanner", returnType: CAPPluginReturnPromise),
    /* OCR ENGINE OPERATIONS */
    CAPPluginMethod(name: "recognizeOcrOnImages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "recognizeOcrOnDocument", returnType: CAPPluginReturnPromise),
    /* PDF GENERATOR OPERATIONS */
    CAPPluginMethod(name: "generatePdfFromImages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "generatePdfFromDocument", returnType: CAPPluginReturnPromise),
    /* TIFF GENERATOR OPERATIONS */
    CAPPluginMethod(name: "generateTiffFromImages", returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "generateTiffFromDocument", returnType: CAPPluginReturnPromise),
    /* PDF EXTRACTOR OPERATIONS */
    CAPPluginMethod(name: "extractImageFilesFromPdf", returnType: CAPPluginReturnPromise),
    /* ImageRef OPERATIONS */
    CAPPluginMethod(name: "imageRefSerialize" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefDeserialize" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefFromImageFileUri" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefFromEncodedBuffer" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefHibernate" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefClear" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefInfo" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefSaveImage" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefEncodeImage" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefRelease" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "makeSnapshot" , returnType: CAPPluginReturnPromise),
    CAPPluginMethod(name: "imageRefReleaseAll" , returnType: CAPPluginReturnPromise),
  ];
  
  var barcodeItemMapperPluginCall : CAPPluginCall? = nil
  var analyticsCall : CAPPluginCall? = nil
  
  let missingRequiredPropertyErrorMsg = "Missing required property "
  
  func presentViewControllerOrReject(_ call: CAPPluginCall) -> UIViewController? {
    guard let activeVC = self.bridge?.viewController
    else {
      call.reject("View controller can't be presented")
      return nil
    }
    
    return activeVC
  }
  
}

extension CAPPluginCall {
  
  var data: [String: Any] { options as? [String: Any] ?? [:] }
  
  var delegate: ResultDelegate { ResultDelegate(self) }
}
