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

#pragma once

#if __has_include(<NitroModules/HybridObject.hpp>)
#include <NitroModules/HybridObject.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif

// Forward declaration of `MediaResult` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct MediaResult; }
// Forward declaration of `CropOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct CropOptions; }
// Forward declaration of `CompressImageOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct CompressImageOptions; }
// Forward declaration of `SplitImageOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct SplitImageOptions; }
// Forward declaration of `FlipOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct FlipOptions; }
// Forward declaration of `RotateOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct RotateOptions; }
// Forward declaration of `VideoCropOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct VideoCropOptions; }
// Forward declaration of `TrimOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct TrimOptions; }
// Forward declaration of `TrimAndCropOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct TrimAndCropOptions; }
// Forward declaration of `ThumbnailResult` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ThumbnailResult; }
// Forward declaration of `ThumbnailOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ThumbnailOptions; }
// Forward declaration of `CompressVideoOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct CompressVideoOptions; }
// Forward declaration of `ProcessVideoOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ProcessVideoOptions; }
// Forward declaration of `ProcessImageOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ProcessImageOptions; }
// Forward declaration of `SpeedOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct SpeedOptions; }
// Forward declaration of `ExtractAudioOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ExtractAudioOptions; }
// Forward declaration of `GeneratePreviewOptions` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct GeneratePreviewOptions; }
// Forward declaration of `ConcatResult` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ConcatResult; }
// Forward declaration of `MediaMetadata` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct MediaMetadata; }

#include "MediaResult.hpp"
#include <NitroModules/Promise.hpp>
#include <string>
#include "CropOptions.hpp"
#include "CompressImageOptions.hpp"
#include <vector>
#include "SplitImageOptions.hpp"
#include "FlipOptions.hpp"
#include "RotateOptions.hpp"
#include "VideoCropOptions.hpp"
#include "TrimOptions.hpp"
#include "TrimAndCropOptions.hpp"
#include "ThumbnailResult.hpp"
#include "ThumbnailOptions.hpp"
#include <optional>
#include "CompressVideoOptions.hpp"
#include "ProcessVideoOptions.hpp"
#include "ProcessImageOptions.hpp"
#include "SpeedOptions.hpp"
#include "ExtractAudioOptions.hpp"
#include "GeneratePreviewOptions.hpp"
#include "ConcatResult.hpp"
#include "MediaMetadata.hpp"

namespace margelo::nitro::mediatoolkit {

  using namespace margelo::nitro;

  /**
   * An abstract base class for `MediaToolkit`
   * Inherit this class to create instances of `HybridMediaToolkitSpec` in C++.
   * You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
   * @example
   * ```cpp
   * class HybridMediaToolkit: public HybridMediaToolkitSpec {
   * public:
   *   HybridMediaToolkit(...): HybridObject(TAG) { ... }
   *   // ...
   * };
   * ```
   */
  class HybridMediaToolkitSpec: public virtual HybridObject {
    public:
      // Constructor
      explicit HybridMediaToolkitSpec(): HybridObject(TAG) { }

      // Destructor
      ~HybridMediaToolkitSpec() override = default;

    public:
      // Properties
      

    public:
      // Methods
      virtual std::shared_ptr<Promise<MediaResult>> cropImage(const std::string& uri, const CropOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> compressImage(const std::string& uri, const CompressImageOptions& options) = 0;
      virtual std::shared_ptr<Promise<std::vector<MediaResult>>> splitImage(const std::string& uri, const SplitImageOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> flipImage(const std::string& uri, const FlipOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> rotateImage(const std::string& uri, const RotateOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> cropVideo(const std::string& uri, const VideoCropOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> trimVideo(const std::string& uri, const TrimOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> trimAndCropVideo(const std::string& uri, const TrimAndCropOptions& options) = 0;
      virtual std::shared_ptr<Promise<ThumbnailResult>> getThumbnail(const std::string& uri, const std::optional<ThumbnailOptions>& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> compressVideo(const std::string& uri, const CompressVideoOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> flipVideo(const std::string& uri, const FlipOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> rotateVideo(const std::string& uri, const RotateOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> processVideo(const std::string& uri, const ProcessVideoOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> processImage(const std::string& uri, const ProcessImageOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> changeVideoSpeed(const std::string& uri, const SpeedOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> extractAudio(const std::string& uri, const ExtractAudioOptions& options) = 0;
      virtual std::shared_ptr<Promise<MediaResult>> generateVideoPreview(const std::string& uri, const GeneratePreviewOptions& options) = 0;
      virtual std::shared_ptr<Promise<ConcatResult>> concatVideos(const std::vector<std::string>& clipPaths, const std::string& outputPath) = 0;
      virtual std::shared_ptr<Promise<MediaMetadata>> getMediaMetadata(const std::string& uri) = 0;

    protected:
      // Hybrid Setup
      void loadHybridMethods() override;

    protected:
      // Tag for logging
      static constexpr auto TAG = "MediaToolkit";
  };

} // namespace margelo::nitro::mediatoolkit
