///
/// CameraSessionConnection.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 `CameraSessionConnection`, backed by a C++ struct.
 */
public typealias CameraSessionConnection = margelo.nitro.camera.CameraSessionConnection

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

  /**
   * Create a new instance of `CameraSessionConnection`.
   */
  init(input: (any HybridCameraDeviceSpec), outputs: [CameraOutputConfiguration], constraints: [Constraint], initialZoom: Double?, initialExposureBias: Double?, onSessionConfigSelected: ((_ config: (any HybridCameraSessionConfigSpec)) -> Void)?) {
    self.init({ () -> bridge.std__shared_ptr_HybridCameraDeviceSpec_ in
      let __cxxWrapped = input.getCxxWrapper()
      return __cxxWrapped.getCxxPart()
    }(), { () -> bridge.std__vector_CameraOutputConfiguration_ in
      var __vector = bridge.create_std__vector_CameraOutputConfiguration_(outputs.count)
      for __item in outputs {
        __vector.push_back(__item)
      }
      return __vector
    }(), { () -> bridge.std__vector_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint__ in
      var __vector = bridge.create_std__vector_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint__(constraints.count)
      for __item in constraints {
        __vector.push_back({ () -> bridge.std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_ in
          switch __item {
            case .first(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .second(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .third(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .fourth(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .fifth(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .sixth(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .seventh(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
            case .eigth(let __value):
              return bridge.create_std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__value)
          }
        }().variant)
      }
      return __vector
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = initialZoom {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = initialExposureBias {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__function_void_const_std__shared_ptr_HybridCameraSessionConfigSpec______config______ in
      if let __unwrappedValue = onSessionConfigSelected {
        return bridge.create_std__optional_std__function_void_const_std__shared_ptr_HybridCameraSessionConfigSpec______config______({ () -> bridge.Func_void_std__shared_ptr_HybridCameraSessionConfigSpec_ in
          let __closureWrapper = Func_void_std__shared_ptr_HybridCameraSessionConfigSpec_(__unwrappedValue)
          return bridge.create_Func_void_std__shared_ptr_HybridCameraSessionConfigSpec_(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var input: (any HybridCameraDeviceSpec) {
    return { () -> any HybridCameraDeviceSpec in
      let __unsafePointer = bridge.get_std__shared_ptr_HybridCameraDeviceSpec_(self.__input)
      let __instance = HybridCameraDeviceSpec_cxx.fromUnsafe(__unsafePointer)
      return __instance.getHybridCameraDeviceSpec()
    }()
  }
  
  @inline(__always)
  var outputs: [CameraOutputConfiguration] {
    return self.__outputs.map({ __item in __item })
  }
  
  @inline(__always)
  var constraints: [Constraint] {
    return self.__constraints.map({ __item in { () -> Constraint in
      let __variant = bridge.std__variant_FPSConstraint__VideoStabilizationModeConstraint__PreviewStabilizationModeConstraint__ResolutionBiasConstraint__VideoDynamicRangeConstraint__PhotoHDRConstraint__PixelFormatConstraint__BinnedConstraint_(__item)
      switch __variant.index() {
        case 0:
          let __actual = __variant.get_0()
          return .first(__actual)
        case 1:
          let __actual = __variant.get_1()
          return .second(__actual)
        case 2:
          let __actual = __variant.get_2()
          return .third(__actual)
        case 3:
          let __actual = __variant.get_3()
          return .fourth(__actual)
        case 4:
          let __actual = __variant.get_4()
          return .fifth(__actual)
        case 5:
          let __actual = __variant.get_5()
          return .sixth(__actual)
        case 6:
          let __actual = __variant.get_6()
          return .seventh(__actual)
        case 7:
          let __actual = __variant.get_7()
          return .eigth(__actual)
        default:
          fatalError("Variant can never have index \(__variant.index())!")
      }
    }() })
  }
  
  @inline(__always)
  var initialZoom: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__initialZoom) {
        let __unwrapped = bridge.get_std__optional_double_(self.__initialZoom)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var initialExposureBias: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__initialExposureBias) {
        let __unwrapped = bridge.get_std__optional_double_(self.__initialExposureBias)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var onSessionConfigSelected: ((_ config: (any HybridCameraSessionConfigSpec)) -> Void)? {
    return { () -> ((_ config: (any HybridCameraSessionConfigSpec)) -> Void)? in
      if bridge.has_value_std__optional_std__function_void_const_std__shared_ptr_HybridCameraSessionConfigSpec______config______(self.__onSessionConfigSelected) {
        let __unwrapped = bridge.get_std__optional_std__function_void_const_std__shared_ptr_HybridCameraSessionConfigSpec______config______(self.__onSessionConfigSelected)
        return { () -> ((any HybridCameraSessionConfigSpec)) -> Void in
          let __wrappedFunction = bridge.wrap_Func_void_std__shared_ptr_HybridCameraSessionConfigSpec_(__unwrapped)
          return { (__config: (any HybridCameraSessionConfigSpec)) -> Void in
            __wrappedFunction.call({ () -> bridge.std__shared_ptr_HybridCameraSessionConfigSpec_ in
              let __cxxWrapped = __config.getCxxWrapper()
              return __cxxWrapped.getCxxPart()
            }())
          }
        }()
      } else {
        return nil
      }
    }()
  }
}
