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

#pragma once

#include "HybridMultipleImagePickerSpec.hpp"

// Forward declaration of `HybridMultipleImagePickerSpec_cxx` to properly resolve imports.
namespace MultipleImagePicker { class HybridMultipleImagePickerSpec_cxx; }

// 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 "MediaType.hpp"
#include <vector>
#include "PickerResult.hpp"
#include <string>
#include <optional>
#include "ResultType.hpp"
#include "SelectBoxStyle.hpp"
#include "SelectMode.hpp"
#include "PickerCropConfig.hpp"
#include "CropRatio.hpp"
#include "Text.hpp"
#include "Language.hpp"
#include "Theme.hpp"
#include "Presentation.hpp"
#include "PickerCameraConfig.hpp"
#include "CameraDevice.hpp"
#include <functional>
#include "NitroCropConfig.hpp"
#include "CropResult.hpp"
#include "MediaPreview.hpp"
#include "NitroPreviewConfig.hpp"
#include "NitroCameraConfig.hpp"
#include "CameraResult.hpp"

#include "MultipleImagePicker-Swift-Cxx-Umbrella.hpp"

namespace margelo::nitro::multipleimagepicker {

  /**
   * The C++ part of HybridMultipleImagePickerSpec_cxx.swift.
   *
   * HybridMultipleImagePickerSpecSwift (C++) accesses HybridMultipleImagePickerSpec_cxx (Swift), and might
   * contain some additional bridging code for C++ <> Swift interop.
   *
   * Since this obviously introduces an overhead, I hope at some point in
   * the future, HybridMultipleImagePickerSpec_cxx can directly inherit from the C++ class HybridMultipleImagePickerSpec
   * to simplify the whole structure and memory management.
   */
  class HybridMultipleImagePickerSpecSwift: public virtual HybridMultipleImagePickerSpec {
  public:
    // Constructor from a Swift instance
    explicit HybridMultipleImagePickerSpecSwift(const MultipleImagePicker::HybridMultipleImagePickerSpec_cxx& swiftPart):
      HybridObject(HybridMultipleImagePickerSpec::TAG),
      _swiftPart(swiftPart) { }

  public:
    // Get the Swift part
    inline MultipleImagePicker::HybridMultipleImagePickerSpec_cxx& getSwiftPart() noexcept {
      return _swiftPart;
    }

  public:
    // Get memory pressure
    inline size_t getExternalMemorySize() noexcept override {
      return _swiftPart.getMemorySize();
    }

  public:
    // Properties
    

  public:
    // Methods
    inline void openPicker(const NitroConfig& config, const std::function<void(const std::vector<PickerResult>& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override {
      auto __result = _swiftPart.openPicker(config, resolved, rejected);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
    }
    inline void openCrop(const std::string& image, const NitroCropConfig& config, const std::function<void(const CropResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override {
      auto __result = _swiftPart.openCrop(image, config, resolved, rejected);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
    }
    inline void openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config, const std::function<void(double /* index */)>& onLongPress) override {
      auto __result = _swiftPart.openPreview(media, std::forward<decltype(index)>(index), config, onLongPress);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
    }
    inline void openCamera(const NitroCameraConfig& config, const std::function<void(const CameraResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override {
      auto __result = _swiftPart.openCamera(config, resolved, rejected);
      if (__result.hasError()) [[unlikely]] {
        std::rethrow_exception(__result.error());
      }
    }

  private:
    MultipleImagePicker::HybridMultipleImagePickerSpec_cxx _swiftPart;
  };

} // namespace margelo::nitro::multipleimagepicker
