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

#include "JHybridMediaToolkitSpec.hpp"

// Forward declaration of `MediaResult` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct MediaResult; }
// Forward declaration of `ThumbnailResult` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct ThumbnailResult; }
// 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; }
// Forward declaration of `LocationData` to properly resolve imports.
namespace margelo::nitro::mediatoolkit { struct LocationData; }
// 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 `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; }

#include "MediaResult.hpp"
#include <NitroModules/Promise.hpp>
#include <NitroModules/JPromise.hpp>
#include "JMediaResult.hpp"
#include <string>
#include <vector>
#include "ThumbnailResult.hpp"
#include "JThumbnailResult.hpp"
#include "ConcatResult.hpp"
#include "JConcatResult.hpp"
#include "MediaMetadata.hpp"
#include "JMediaMetadata.hpp"
#include <optional>
#include "LocationData.hpp"
#include "JLocationData.hpp"
#include "CropOptions.hpp"
#include "JCropOptions.hpp"
#include "CompressImageOptions.hpp"
#include "JCompressImageOptions.hpp"
#include "SplitImageOptions.hpp"
#include "JSplitImageOptions.hpp"
#include "FlipOptions.hpp"
#include "JFlipOptions.hpp"
#include "RotateOptions.hpp"
#include "JRotateOptions.hpp"
#include "VideoCropOptions.hpp"
#include "JVideoCropOptions.hpp"
#include "TrimOptions.hpp"
#include "JTrimOptions.hpp"
#include "TrimAndCropOptions.hpp"
#include "JTrimAndCropOptions.hpp"
#include "ThumbnailOptions.hpp"
#include "JThumbnailOptions.hpp"
#include "CompressVideoOptions.hpp"
#include "JCompressVideoOptions.hpp"
#include "ProcessVideoOptions.hpp"
#include "JProcessVideoOptions.hpp"
#include "ProcessImageOptions.hpp"
#include "JProcessImageOptions.hpp"
#include "SpeedOptions.hpp"
#include "JSpeedOptions.hpp"
#include "ExtractAudioOptions.hpp"
#include "JExtractAudioOptions.hpp"
#include "GeneratePreviewOptions.hpp"
#include "JGeneratePreviewOptions.hpp"

namespace margelo::nitro::mediatoolkit {

  std::shared_ptr<JHybridMediaToolkitSpec> JHybridMediaToolkitSpec::JavaPart::getJHybridMediaToolkitSpec() {
    auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
    auto castHybridObject = std::dynamic_pointer_cast<JHybridMediaToolkitSpec>(hybridObject);
    if (castHybridObject == nullptr) [[unlikely]] {
      throw std::runtime_error("Failed to downcast JHybridObject to JHybridMediaToolkitSpec!");
    }
    return castHybridObject;
  }

  jni::local_ref<JHybridMediaToolkitSpec::CxxPart::jhybriddata> JHybridMediaToolkitSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
    return makeCxxInstance(jThis);
  }

  std::shared_ptr<JHybridObject> JHybridMediaToolkitSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
    auto castJavaPart = jni::dynamic_ref_cast<JHybridMediaToolkitSpec::JavaPart>(javaPart);
    if (castJavaPart == nullptr) [[unlikely]] {
      throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridMediaToolkitSpec::JavaPart!");
    }
    return std::make_shared<JHybridMediaToolkitSpec>(castJavaPart);
  }

  void JHybridMediaToolkitSpec::CxxPart::registerNatives() {
    registerHybrid({
      makeNativeMethod("initHybrid", JHybridMediaToolkitSpec::CxxPart::initHybrid),
    });
  }

  // Properties
  

  // Methods
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::cropImage(const std::string& uri, const CropOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JCropOptions> /* options */)>("cropImage");
    auto __result = method(_javaPart, jni::make_jstring(uri), JCropOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::compressImage(const std::string& uri, const CompressImageOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JCompressImageOptions> /* options */)>("compressImage");
    auto __result = method(_javaPart, jni::make_jstring(uri), JCompressImageOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<std::vector<MediaResult>>> JHybridMediaToolkitSpec::splitImage(const std::string& uri, const SplitImageOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JSplitImageOptions> /* options */)>("splitImage");
    auto __result = method(_javaPart, jni::make_jstring(uri), JSplitImageOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<std::vector<MediaResult>>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<jni::JArrayClass<JMediaResult>>(__boxedResult);
        __promise->resolve([&]() {
          size_t __size = __result->size();
          std::vector<MediaResult> __vector;
          __vector.reserve(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            auto __element = __result->getElement(__i);
            __vector.push_back(__element->toCpp());
          }
          return __vector;
        }());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::flipImage(const std::string& uri, const FlipOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JFlipOptions> /* options */)>("flipImage");
    auto __result = method(_javaPart, jni::make_jstring(uri), JFlipOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::rotateImage(const std::string& uri, const RotateOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JRotateOptions> /* options */)>("rotateImage");
    auto __result = method(_javaPart, jni::make_jstring(uri), JRotateOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::cropVideo(const std::string& uri, const VideoCropOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JVideoCropOptions> /* options */)>("cropVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JVideoCropOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::trimVideo(const std::string& uri, const TrimOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JTrimOptions> /* options */)>("trimVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JTrimOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::trimAndCropVideo(const std::string& uri, const TrimAndCropOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JTrimAndCropOptions> /* options */)>("trimAndCropVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JTrimAndCropOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<ThumbnailResult>> JHybridMediaToolkitSpec::getThumbnail(const std::string& uri, const std::optional<ThumbnailOptions>& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JThumbnailOptions> /* options */)>("getThumbnail");
    auto __result = method(_javaPart, jni::make_jstring(uri), options.has_value() ? JThumbnailOptions::fromCpp(options.value()) : nullptr);
    return [&]() {
      auto __promise = Promise<ThumbnailResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JThumbnailResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::compressVideo(const std::string& uri, const CompressVideoOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JCompressVideoOptions> /* options */)>("compressVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JCompressVideoOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::flipVideo(const std::string& uri, const FlipOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JFlipOptions> /* options */)>("flipVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JFlipOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::rotateVideo(const std::string& uri, const RotateOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JRotateOptions> /* options */)>("rotateVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JRotateOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::processVideo(const std::string& uri, const ProcessVideoOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JProcessVideoOptions> /* options */)>("processVideo");
    auto __result = method(_javaPart, jni::make_jstring(uri), JProcessVideoOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::processImage(const std::string& uri, const ProcessImageOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JProcessImageOptions> /* options */)>("processImage");
    auto __result = method(_javaPart, jni::make_jstring(uri), JProcessImageOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::changeVideoSpeed(const std::string& uri, const SpeedOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JSpeedOptions> /* options */)>("changeVideoSpeed");
    auto __result = method(_javaPart, jni::make_jstring(uri), JSpeedOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::extractAudio(const std::string& uri, const ExtractAudioOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JExtractAudioOptions> /* options */)>("extractAudio");
    auto __result = method(_javaPart, jni::make_jstring(uri), JExtractAudioOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaResult>> JHybridMediaToolkitSpec::generateVideoPreview(const std::string& uri, const GeneratePreviewOptions& options) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */, jni::alias_ref<JGeneratePreviewOptions> /* options */)>("generateVideoPreview");
    auto __result = method(_javaPart, jni::make_jstring(uri), JGeneratePreviewOptions::fromCpp(options));
    return [&]() {
      auto __promise = Promise<MediaResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<ConcatResult>> JHybridMediaToolkitSpec::concatVideos(const std::vector<std::string>& clipPaths, const std::string& outputPath) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JArrayClass<jni::JString>> /* clipPaths */, jni::alias_ref<jni::JString> /* outputPath */)>("concatVideos");
    auto __result = method(_javaPart, [&]() {
      size_t __size = clipPaths.size();
      jni::local_ref<jni::JArrayClass<jni::JString>> __array = jni::JArrayClass<jni::JString>::newArray(__size);
      for (size_t __i = 0; __i < __size; __i++) {
        const auto& __element = clipPaths[__i];
        auto __elementJni = jni::make_jstring(__element);
        __array->setElement(__i, *__elementJni);
      }
      return __array;
    }(), jni::make_jstring(outputPath));
    return [&]() {
      auto __promise = Promise<ConcatResult>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JConcatResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<MediaMetadata>> JHybridMediaToolkitSpec::getMediaMetadata(const std::string& uri) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* uri */)>("getMediaMetadata");
    auto __result = method(_javaPart, jni::make_jstring(uri));
    return [&]() {
      auto __promise = Promise<MediaMetadata>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JMediaMetadata>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }

} // namespace margelo::nitro::mediatoolkit
