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

import NitroModules

/// See ``HybridMediaToolkitSpec``
public protocol HybridMediaToolkitSpec_protocol: HybridObject {
  // Properties
  

  // Methods
  func cropImage(uri: String, options: CropOptions) throws -> Promise<MediaResult>
  func compressImage(uri: String, options: CompressImageOptions) throws -> Promise<MediaResult>
  func splitImage(uri: String, options: SplitImageOptions) throws -> Promise<[MediaResult]>
  func flipImage(uri: String, options: FlipOptions) throws -> Promise<MediaResult>
  func rotateImage(uri: String, options: RotateOptions) throws -> Promise<MediaResult>
  func cropVideo(uri: String, options: VideoCropOptions) throws -> Promise<MediaResult>
  func trimVideo(uri: String, options: TrimOptions) throws -> Promise<MediaResult>
  func trimAndCropVideo(uri: String, options: TrimAndCropOptions) throws -> Promise<MediaResult>
  func getThumbnail(uri: String, options: ThumbnailOptions?) throws -> Promise<ThumbnailResult>
  func compressVideo(uri: String, options: CompressVideoOptions) throws -> Promise<MediaResult>
  func flipVideo(uri: String, options: FlipOptions) throws -> Promise<MediaResult>
  func rotateVideo(uri: String, options: RotateOptions) throws -> Promise<MediaResult>
  func processVideo(uri: String, options: ProcessVideoOptions) throws -> Promise<MediaResult>
  func processImage(uri: String, options: ProcessImageOptions) throws -> Promise<MediaResult>
  func changeVideoSpeed(uri: String, options: SpeedOptions) throws -> Promise<MediaResult>
  func extractAudio(uri: String, options: ExtractAudioOptions) throws -> Promise<MediaResult>
  func generateVideoPreview(uri: String, options: GeneratePreviewOptions) throws -> Promise<MediaResult>
  func concatVideos(clipPaths: [String], outputPath: String) throws -> Promise<ConcatResult>
  func getMediaMetadata(uri: String) throws -> Promise<MediaMetadata>
}

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

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

/**
 * A Swift base-protocol representing the MediaToolkit HybridObject.
 * Implement this protocol to create Swift-based instances of MediaToolkit.
 * ```swift
 * class HybridMediaToolkit : HybridMediaToolkitSpec {
 *   // ...
 * }
 * ```
 */
public typealias HybridMediaToolkitSpec = HybridMediaToolkitSpec_protocol & HybridMediaToolkitSpec_base
