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

import NitroImage
import NitroModules

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

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

  /**
   * Create a new instance of `CapturePhotoCallbacks`.
   */
  init(onWillBeginCapture: (() -> Void)?, onWillCapturePhoto: (() -> Void)?, onDidCapturePhoto: (() -> Void)?, onPreviewImageAvailable: ((_ previewImage: (any HybridImageSpec)) -> Void)?) {
    self.init({ () -> bridge.std__optional_std__function_void____ in
      if let __unwrappedValue = onWillBeginCapture {
        return bridge.create_std__optional_std__function_void____({ () -> bridge.Func_void in
          let __closureWrapper = Func_void(__unwrappedValue)
          return bridge.create_Func_void(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__function_void____ in
      if let __unwrappedValue = onWillCapturePhoto {
        return bridge.create_std__optional_std__function_void____({ () -> bridge.Func_void in
          let __closureWrapper = Func_void(__unwrappedValue)
          return bridge.create_Func_void(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__function_void____ in
      if let __unwrappedValue = onDidCapturePhoto {
        return bridge.create_std__optional_std__function_void____({ () -> bridge.Func_void in
          let __closureWrapper = Func_void(__unwrappedValue)
          return bridge.create_Func_void(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__function_void_const_std__shared_ptr_margelo__nitro__image__HybridImageSpec______previewImage______ in
      if let __unwrappedValue = onPreviewImageAvailable {
        return bridge.create_std__optional_std__function_void_const_std__shared_ptr_margelo__nitro__image__HybridImageSpec______previewImage______({ () -> bridge.Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ in
          let __closureWrapper = Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(__unwrappedValue)
          return bridge.create_Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(__closureWrapper.toUnsafe())
        }())
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var onWillBeginCapture: (() -> Void)? {
    return { () -> (() -> Void)? in
      if bridge.has_value_std__optional_std__function_void____(self.__onWillBeginCapture) {
        let __unwrapped = bridge.get_std__optional_std__function_void____(self.__onWillBeginCapture)
        return { () -> () -> Void in
          let __wrappedFunction = bridge.wrap_Func_void(__unwrapped)
          return { () -> Void in
            __wrappedFunction.call()
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var onWillCapturePhoto: (() -> Void)? {
    return { () -> (() -> Void)? in
      if bridge.has_value_std__optional_std__function_void____(self.__onWillCapturePhoto) {
        let __unwrapped = bridge.get_std__optional_std__function_void____(self.__onWillCapturePhoto)
        return { () -> () -> Void in
          let __wrappedFunction = bridge.wrap_Func_void(__unwrapped)
          return { () -> Void in
            __wrappedFunction.call()
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var onDidCapturePhoto: (() -> Void)? {
    return { () -> (() -> Void)? in
      if bridge.has_value_std__optional_std__function_void____(self.__onDidCapturePhoto) {
        let __unwrapped = bridge.get_std__optional_std__function_void____(self.__onDidCapturePhoto)
        return { () -> () -> Void in
          let __wrappedFunction = bridge.wrap_Func_void(__unwrapped)
          return { () -> Void in
            __wrappedFunction.call()
          }
        }()
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var onPreviewImageAvailable: ((_ previewImage: (any HybridImageSpec)) -> Void)? {
    return { () -> ((_ previewImage: (any HybridImageSpec)) -> Void)? in
      if bridge.has_value_std__optional_std__function_void_const_std__shared_ptr_margelo__nitro__image__HybridImageSpec______previewImage______(self.__onPreviewImageAvailable) {
        let __unwrapped = bridge.get_std__optional_std__function_void_const_std__shared_ptr_margelo__nitro__image__HybridImageSpec______previewImage______(self.__onPreviewImageAvailable)
        return { () -> ((any HybridImageSpec)) -> Void in
          let __wrappedFunction = bridge.wrap_Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(__unwrapped)
          return { (__previewImage: (any HybridImageSpec)) -> Void in
            __wrappedFunction.call({ () -> bridge.std__shared_ptr_margelo__nitro__image__HybridImageSpec_ in
              let __cxxWrapped = __previewImage.getCxxWrapper()
              return __cxxWrapped.getCxxPart()
            }())
          }
        }()
      } else {
        return nil
      }
    }()
  }
}
