///
/// FaceDetectorOutputOptions.swift
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

import NitroModules

/**
 * Represents an instance of `FaceDetectorOutputOptions`, backed by a C++ struct.
 */
public typealias FaceDetectorOutputOptions = margelo.nitro.camera.facedetector.FaceDetectorOutputOptions

public extension FaceDetectorOutputOptions {
  private typealias bridge = margelo.nitro.camera.facedetector.bridge.swift

  /**
   * Create a new instance of `FaceDetectorOutputOptions`.
   */
  init(outputResolution: FaceDetectorOutputResolution?, onFacesDetected: @escaping (_ faces: [(any HybridFaceSpec)]) -> Void, onError: @escaping (_ error: Error) -> Void, cameraFacing: CameraPosition?, autoMode: Bool?, windowWidth: Double?, windowHeight: Double?, performanceMode: PerformanceMode?, runLandmarks: Bool?, runContours: Bool?, runClassifications: Bool?, minFaceSize: Double?, trackingEnabled: Bool?) {
    self.init({ () -> bridge.std__optional_FaceDetectorOutputResolution_ in
      if let __unwrappedValue = outputResolution {
        return bridge.create_std__optional_FaceDetectorOutputResolution_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.Func_void_std__vector_std__shared_ptr_HybridFaceSpec__ in
      let __closureWrapper = Func_void_std__vector_std__shared_ptr_HybridFaceSpec__(onFacesDetected)
      return bridge.create_Func_void_std__vector_std__shared_ptr_HybridFaceSpec__(__closureWrapper.toUnsafe())
    }(), { () -> bridge.Func_void_std__exception_ptr in
      let __closureWrapper = Func_void_std__exception_ptr(onError)
      return bridge.create_Func_void_std__exception_ptr(__closureWrapper.toUnsafe())
    }(), { () -> bridge.std__optional_CameraPosition_ in
      if let __unwrappedValue = cameraFacing {
        return bridge.create_std__optional_CameraPosition_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = autoMode {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = windowWidth {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = windowHeight {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_PerformanceMode_ in
      if let __unwrappedValue = performanceMode {
        return bridge.create_std__optional_PerformanceMode_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = runLandmarks {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = runContours {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = runClassifications {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = minFaceSize {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_bool_ in
      if let __unwrappedValue = trackingEnabled {
        return bridge.create_std__optional_bool_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var outputResolution: FaceDetectorOutputResolution? {
    return self.__outputResolution.value
  }
  
  @inline(__always)
  var onFacesDetected: (_ faces: [(any HybridFaceSpec)]) -> Void {
    return { () -> ([(any HybridFaceSpec)]) -> Void in
      let __wrappedFunction = bridge.wrap_Func_void_std__vector_std__shared_ptr_HybridFaceSpec__(self.__onFacesDetected)
      return { (__faces: [(any HybridFaceSpec)]) -> Void in
        __wrappedFunction.call({ () -> bridge.std__vector_std__shared_ptr_HybridFaceSpec__ in
          var __vector = bridge.create_std__vector_std__shared_ptr_HybridFaceSpec__(__faces.count)
          for __item in __faces {
            __vector.push_back({ () -> bridge.std__shared_ptr_HybridFaceSpec_ in
              let __cxxWrapped = __item.getCxxWrapper()
              return __cxxWrapped.getCxxPart()
            }())
          }
          return __vector
        }())
      }
    }()
  }
  
  @inline(__always)
  var onError: (_ error: Error) -> Void {
    return { () -> (Error) -> Void in
      let __wrappedFunction = bridge.wrap_Func_void_std__exception_ptr(self.__onError)
      return { (__error: Error) -> Void in
        __wrappedFunction.call(__error.toCpp())
      }
    }()
  }
  
  @inline(__always)
  var cameraFacing: CameraPosition? {
    return self.__cameraFacing.value
  }
  
  @inline(__always)
  var autoMode: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__autoMode) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__autoMode)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var windowWidth: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__windowWidth) {
        let __unwrapped = bridge.get_std__optional_double_(self.__windowWidth)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var windowHeight: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__windowHeight) {
        let __unwrapped = bridge.get_std__optional_double_(self.__windowHeight)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var performanceMode: PerformanceMode? {
    return self.__performanceMode.value
  }
  
  @inline(__always)
  var runLandmarks: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__runLandmarks) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__runLandmarks)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var runContours: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__runContours) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__runContours)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var runClassifications: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__runClassifications) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__runClassifications)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var minFaceSize: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__minFaceSize) {
        let __unwrapped = bridge.get_std__optional_double_(self.__minFaceSize)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var trackingEnabled: Bool? {
    return { () -> Bool? in
      if bridge.has_value_std__optional_bool_(self.__trackingEnabled) {
        let __unwrapped = bridge.get_std__optional_bool_(self.__trackingEnabled)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
}
