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

import NitroModules

/// See ``HybridCameraControllerSpec``
public protocol HybridCameraControllerSpec_protocol: HybridObject {
  // Properties
  var device: (any HybridCameraDeviceSpec) { get }
  var isConnected: Bool { get }
  var isSuspended: Bool { get }
  var isUsedByAnotherApp: Bool { get }
  var isLowLightBoostEnabled: Bool { get }
  var isSmoothAutoFocusEnabled: Bool { get }
  var isDistortionCorrectionEnabled: Bool { get }
  var zoom: Double { get }
  var minZoom: Double { get }
  var maxZoom: Double { get }
  var displayableZoomFactor: Double { get }
  var torchStrength: Double { get }
  var torchMode: TorchMode { get }
  var exposureBias: Double { get }
  var focusMode: FocusMode { get }
  var lensPosition: Double { get }
  var exposureMode: ExposureMode { get }
  var minExposureDuration: Double { get }
  var maxExposureDuration: Double { get }
  var minISO: Double { get }
  var maxISO: Double { get }
  var exposureDuration: Double { get }
  var iso: Double { get }
  var whiteBalanceMode: WhiteBalanceMode { get }
  var whiteBalanceGains: WhiteBalanceGains { get }

  // Methods
  func configure(config: CameraControllerConfiguration) throws -> Promise<Void>
  func focusTo(point: (any HybridMeteringPointSpec), options: FocusOptions) throws -> Promise<Void>
  func resetFocus() throws -> Promise<Void>
  func addSubjectAreaChangedListener(onSubjectAreaChanged: @escaping () -> Void) throws -> ListenerSubscription
  func setZoom(zoom: Double) throws -> Promise<Void>
  func startZoomAnimation(zoom: Double, rate: Double) throws -> Promise<Void>
  func cancelZoomAnimation() throws -> Promise<Void>
  func setTorchMode(mode: TorchMode) throws -> Promise<Void>
  func enableTorchWithStrength(strength: Double) throws -> Promise<Void>
  func setExposureBias(exposure: Double) throws -> Promise<Void>
  func setFocusLocked(lensPosition: Double) throws -> Promise<Void>
  func lockCurrentFocus() throws -> Promise<Void>
  func setExposureLocked(duration: Double, iso: Double) throws -> Promise<Void>
  func lockCurrentExposure() throws -> Promise<Void>
  func convertWhiteBalanceTemperatureAndTintValues(whiteBalanceTemperatureAndTint: WhiteBalanceTemperatureAndTint) throws -> WhiteBalanceGains
  func setWhiteBalanceLocked(whiteBalanceGains: WhiteBalanceGains) throws -> Promise<Void>
  func lockCurrentWhiteBalance() throws -> Promise<Void>
}

public extension HybridCameraControllerSpec_protocol {
  /// Default implementation of ``HybridObject.toString``
  func toString() -> String {
    return "[HybridObject CameraController]"
  }
}

/// See ``HybridCameraControllerSpec``
open class HybridCameraControllerSpec_base {
  private weak var cxxWrapper: HybridCameraControllerSpec_cxx? = nil
  public init() { }
  public func getCxxWrapper() -> HybridCameraControllerSpec_cxx {
  #if DEBUG
    guard self is any HybridCameraControllerSpec else {
      fatalError("`self` is not a `HybridCameraControllerSpec`! Did you accidentally inherit from `HybridCameraControllerSpec_base` instead of `HybridCameraControllerSpec`?")
    }
  #endif
    if let cxxWrapper = self.cxxWrapper {
      return cxxWrapper
    } else {
      let cxxWrapper = HybridCameraControllerSpec_cxx(self as! any HybridCameraControllerSpec)
      self.cxxWrapper = cxxWrapper
      return cxxWrapper
    }
  }
}

/**
 * A Swift base-protocol representing the CameraController HybridObject.
 * Implement this protocol to create Swift-based instances of CameraController.
 * ```swift
 * class HybridCameraController : HybridCameraControllerSpec {
 *   // ...
 * }
 * ```
 */
public typealias HybridCameraControllerSpec = HybridCameraControllerSpec_protocol & HybridCameraControllerSpec_base
