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

#include "JHybridMultipleImagePickerSpec.hpp"

// Forward declaration of `NitroConfig` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct NitroConfig; }
// Forward declaration of `MediaType` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class MediaType; }
// Forward declaration of `PickerResult` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct PickerResult; }
// Forward declaration of `ResultType` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class ResultType; }
// Forward declaration of `SelectBoxStyle` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class SelectBoxStyle; }
// Forward declaration of `SelectMode` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class SelectMode; }
// Forward declaration of `PickerCropConfig` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct PickerCropConfig; }
// Forward declaration of `CropRatio` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct CropRatio; }
// Forward declaration of `Text` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct Text; }
// Forward declaration of `Language` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class Language; }
// Forward declaration of `Theme` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class Theme; }
// Forward declaration of `Presentation` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class Presentation; }
// Forward declaration of `PickerCameraConfig` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct PickerCameraConfig; }
// Forward declaration of `CameraDevice` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { enum class CameraDevice; }
// Forward declaration of `NitroCropConfig` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct NitroCropConfig; }
// Forward declaration of `CropResult` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct CropResult; }
// Forward declaration of `MediaPreview` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct MediaPreview; }
// Forward declaration of `NitroPreviewConfig` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct NitroPreviewConfig; }
// Forward declaration of `NitroCameraConfig` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct NitroCameraConfig; }
// Forward declaration of `CameraResult` to properly resolve imports.
namespace margelo::nitro::multipleimagepicker { struct CameraResult; }

#include "NitroConfig.hpp"
#include "JNitroConfig.hpp"
#include "MediaType.hpp"
#include "JMediaType.hpp"
#include "PickerResult.hpp"
#include <vector>
#include "JPickerResult.hpp"
#include <string>
#include <optional>
#include "ResultType.hpp"
#include "JResultType.hpp"
#include "SelectBoxStyle.hpp"
#include "JSelectBoxStyle.hpp"
#include "SelectMode.hpp"
#include "JSelectMode.hpp"
#include "PickerCropConfig.hpp"
#include "JPickerCropConfig.hpp"
#include "CropRatio.hpp"
#include "JCropRatio.hpp"
#include "Text.hpp"
#include "JText.hpp"
#include "Language.hpp"
#include "JLanguage.hpp"
#include "Theme.hpp"
#include "JTheme.hpp"
#include "Presentation.hpp"
#include "JPresentation.hpp"
#include "PickerCameraConfig.hpp"
#include "JPickerCameraConfig.hpp"
#include "CameraDevice.hpp"
#include "JCameraDevice.hpp"
#include <functional>
#include "JFunc_void_std__vector_PickerResult_.hpp"
#include <NitroModules/JNICallable.hpp>
#include "JFunc_void_double.hpp"
#include "NitroCropConfig.hpp"
#include "JNitroCropConfig.hpp"
#include "CropResult.hpp"
#include "JFunc_void_CropResult.hpp"
#include "JCropResult.hpp"
#include "MediaPreview.hpp"
#include "JMediaPreview.hpp"
#include "NitroPreviewConfig.hpp"
#include "JNitroPreviewConfig.hpp"
#include "NitroCameraConfig.hpp"
#include "JNitroCameraConfig.hpp"
#include "CameraResult.hpp"
#include "JFunc_void_CameraResult.hpp"
#include "JCameraResult.hpp"

namespace margelo::nitro::multipleimagepicker {

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

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

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

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

  // Properties
  

  // Methods
  void JHybridMultipleImagePickerSpec::openPicker(const NitroConfig& config, const std::function<void(const std::vector<PickerResult>& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JNitroConfig> /* config */, jni::alias_ref<JFunc_void_std__vector_PickerResult_::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openPicker_cxx");
    method(_javaPart, JNitroConfig::fromCpp(config), JFunc_void_std__vector_PickerResult__cxx::fromCpp(resolved), JFunc_void_double_cxx::fromCpp(rejected));
  }
  void JHybridMultipleImagePickerSpec::openCrop(const std::string& image, const NitroCropConfig& config, const std::function<void(const CropResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* image */, jni::alias_ref<JNitroCropConfig> /* config */, jni::alias_ref<JFunc_void_CropResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCrop_cxx");
    method(_javaPart, jni::make_jstring(image), JNitroCropConfig::fromCpp(config), JFunc_void_CropResult_cxx::fromCpp(resolved), JFunc_void_double_cxx::fromCpp(rejected));
  }
  void JHybridMultipleImagePickerSpec::openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config, const std::function<void(double /* index */)>& onLongPress) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JArrayClass<JMediaPreview>> /* media */, double /* index */, jni::alias_ref<JNitroPreviewConfig> /* config */, jni::alias_ref<JFunc_void_double::javaobject> /* onLongPress */)>("openPreview_cxx");
    method(_javaPart, [&]() {
      size_t __size = media.size();
      jni::local_ref<jni::JArrayClass<JMediaPreview>> __array = jni::JArrayClass<JMediaPreview>::newArray(__size);
      for (size_t __i = 0; __i < __size; __i++) {
        const auto& __element = media[__i];
        auto __elementJni = JMediaPreview::fromCpp(__element);
        __array->setElement(__i, *__elementJni);
      }
      return __array;
    }(), index, JNitroPreviewConfig::fromCpp(config), JFunc_void_double_cxx::fromCpp(onLongPress));
  }
  void JHybridMultipleImagePickerSpec::openCamera(const NitroCameraConfig& config, const std::function<void(const CameraResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JNitroCameraConfig> /* config */, jni::alias_ref<JFunc_void_CameraResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCamera_cxx");
    method(_javaPart, JNitroCameraConfig::fromCpp(config), JFunc_void_CameraResult_cxx::fromCpp(resolved), JFunc_void_double_cxx::fromCpp(rejected));
  }

} // namespace margelo::nitro::multipleimagepicker
