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

#pragma once

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

// 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 `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 `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; }

#include "MediaType.hpp"
#include <vector>
#include "PickerResult.hpp"
#include "SelectBoxStyle.hpp"
#include "SelectMode.hpp"
#include <optional>
#include "PickerCropConfig.hpp"
#include "Text.hpp"
#include "Language.hpp"
#include "Theme.hpp"
#include "Presentation.hpp"
#include "PickerCameraConfig.hpp"

namespace margelo::nitro::multipleimagepicker {

  /**
   * A struct which can be represented as a JavaScript object (NitroConfig).
   */
  struct NitroConfig {
  public:
    MediaType mediaType     SWIFT_PRIVATE;
    std::vector<PickerResult> selectedAssets     SWIFT_PRIVATE;
    SelectBoxStyle selectBoxStyle     SWIFT_PRIVATE;
    SelectMode selectMode     SWIFT_PRIVATE;
    std::optional<double> numberOfColumn     SWIFT_PRIVATE;
    std::optional<bool> isPreview     SWIFT_PRIVATE;
    std::optional<double> primaryColor     SWIFT_PRIVATE;
    std::optional<bool> allowSwipeToSelect     SWIFT_PRIVATE;
    std::optional<double> spacing     SWIFT_PRIVATE;
    std::optional<bool> isHiddenPreviewButton     SWIFT_PRIVATE;
    std::optional<bool> isHiddenOriginalButton     SWIFT_PRIVATE;
    std::optional<bool> isShowPreviewList     SWIFT_PRIVATE;
    std::optional<bool> allowHapticTouchPreview     SWIFT_PRIVATE;
    std::optional<bool> allowedLimit     SWIFT_PRIVATE;
    std::optional<double> maxVideo     SWIFT_PRIVATE;
    std::optional<double> maxSelect     SWIFT_PRIVATE;
    std::optional<double> maxVideoDuration     SWIFT_PRIVATE;
    std::optional<double> minVideoDuration     SWIFT_PRIVATE;
    std::optional<double> maxFileSize     SWIFT_PRIVATE;
    std::optional<double> backgroundDark     SWIFT_PRIVATE;
    std::optional<PickerCropConfig> crop     SWIFT_PRIVATE;
    std::optional<Text> text     SWIFT_PRIVATE;
    Language language     SWIFT_PRIVATE;
    Theme theme     SWIFT_PRIVATE;
    Presentation presentation     SWIFT_PRIVATE;
    std::optional<PickerCameraConfig> camera     SWIFT_PRIVATE;

  public:
    NitroConfig() = default;
    explicit NitroConfig(MediaType mediaType, std::vector<PickerResult> selectedAssets, SelectBoxStyle selectBoxStyle, SelectMode selectMode, std::optional<double> numberOfColumn, std::optional<bool> isPreview, std::optional<double> primaryColor, std::optional<bool> allowSwipeToSelect, std::optional<double> spacing, std::optional<bool> isHiddenPreviewButton, std::optional<bool> isHiddenOriginalButton, std::optional<bool> isShowPreviewList, std::optional<bool> allowHapticTouchPreview, std::optional<bool> allowedLimit, std::optional<double> maxVideo, std::optional<double> maxSelect, std::optional<double> maxVideoDuration, std::optional<double> minVideoDuration, std::optional<double> maxFileSize, std::optional<double> backgroundDark, std::optional<PickerCropConfig> crop, std::optional<Text> text, Language language, Theme theme, Presentation presentation, std::optional<PickerCameraConfig> camera): mediaType(mediaType), selectedAssets(selectedAssets), selectBoxStyle(selectBoxStyle), selectMode(selectMode), numberOfColumn(numberOfColumn), isPreview(isPreview), primaryColor(primaryColor), allowSwipeToSelect(allowSwipeToSelect), spacing(spacing), isHiddenPreviewButton(isHiddenPreviewButton), isHiddenOriginalButton(isHiddenOriginalButton), isShowPreviewList(isShowPreviewList), allowHapticTouchPreview(allowHapticTouchPreview), allowedLimit(allowedLimit), maxVideo(maxVideo), maxSelect(maxSelect), maxVideoDuration(maxVideoDuration), minVideoDuration(minVideoDuration), maxFileSize(maxFileSize), backgroundDark(backgroundDark), crop(crop), text(text), language(language), theme(theme), presentation(presentation), camera(camera) {}
  };

} // namespace margelo::nitro::multipleimagepicker

namespace margelo::nitro {

  using namespace margelo::nitro::multipleimagepicker;

  // C++ NitroConfig <> JS NitroConfig (object)
  template <>
  struct JSIConverter<NitroConfig> final {
    static inline NitroConfig fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
      jsi::Object obj = arg.asObject(runtime);
      return NitroConfig(
        JSIConverter<MediaType>::fromJSI(runtime, obj.getProperty(runtime, "mediaType")),
        JSIConverter<std::vector<PickerResult>>::fromJSI(runtime, obj.getProperty(runtime, "selectedAssets")),
        JSIConverter<SelectBoxStyle>::fromJSI(runtime, obj.getProperty(runtime, "selectBoxStyle")),
        JSIConverter<SelectMode>::fromJSI(runtime, obj.getProperty(runtime, "selectMode")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "numberOfColumn")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "isPreview")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "primaryColor")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "allowSwipeToSelect")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "spacing")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "isHiddenPreviewButton")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "isHiddenOriginalButton")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "isShowPreviewList")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "allowHapticTouchPreview")),
        JSIConverter<std::optional<bool>>::fromJSI(runtime, obj.getProperty(runtime, "allowedLimit")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "maxVideo")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "maxSelect")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "maxVideoDuration")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "minVideoDuration")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "maxFileSize")),
        JSIConverter<std::optional<double>>::fromJSI(runtime, obj.getProperty(runtime, "backgroundDark")),
        JSIConverter<std::optional<PickerCropConfig>>::fromJSI(runtime, obj.getProperty(runtime, "crop")),
        JSIConverter<std::optional<Text>>::fromJSI(runtime, obj.getProperty(runtime, "text")),
        JSIConverter<Language>::fromJSI(runtime, obj.getProperty(runtime, "language")),
        JSIConverter<Theme>::fromJSI(runtime, obj.getProperty(runtime, "theme")),
        JSIConverter<Presentation>::fromJSI(runtime, obj.getProperty(runtime, "presentation")),
        JSIConverter<std::optional<PickerCameraConfig>>::fromJSI(runtime, obj.getProperty(runtime, "camera"))
      );
    }
    static inline jsi::Value toJSI(jsi::Runtime& runtime, const NitroConfig& arg) {
      jsi::Object obj(runtime);
      obj.setProperty(runtime, "mediaType", JSIConverter<MediaType>::toJSI(runtime, arg.mediaType));
      obj.setProperty(runtime, "selectedAssets", JSIConverter<std::vector<PickerResult>>::toJSI(runtime, arg.selectedAssets));
      obj.setProperty(runtime, "selectBoxStyle", JSIConverter<SelectBoxStyle>::toJSI(runtime, arg.selectBoxStyle));
      obj.setProperty(runtime, "selectMode", JSIConverter<SelectMode>::toJSI(runtime, arg.selectMode));
      obj.setProperty(runtime, "numberOfColumn", JSIConverter<std::optional<double>>::toJSI(runtime, arg.numberOfColumn));
      obj.setProperty(runtime, "isPreview", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.isPreview));
      obj.setProperty(runtime, "primaryColor", JSIConverter<std::optional<double>>::toJSI(runtime, arg.primaryColor));
      obj.setProperty(runtime, "allowSwipeToSelect", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.allowSwipeToSelect));
      obj.setProperty(runtime, "spacing", JSIConverter<std::optional<double>>::toJSI(runtime, arg.spacing));
      obj.setProperty(runtime, "isHiddenPreviewButton", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.isHiddenPreviewButton));
      obj.setProperty(runtime, "isHiddenOriginalButton", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.isHiddenOriginalButton));
      obj.setProperty(runtime, "isShowPreviewList", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.isShowPreviewList));
      obj.setProperty(runtime, "allowHapticTouchPreview", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.allowHapticTouchPreview));
      obj.setProperty(runtime, "allowedLimit", JSIConverter<std::optional<bool>>::toJSI(runtime, arg.allowedLimit));
      obj.setProperty(runtime, "maxVideo", JSIConverter<std::optional<double>>::toJSI(runtime, arg.maxVideo));
      obj.setProperty(runtime, "maxSelect", JSIConverter<std::optional<double>>::toJSI(runtime, arg.maxSelect));
      obj.setProperty(runtime, "maxVideoDuration", JSIConverter<std::optional<double>>::toJSI(runtime, arg.maxVideoDuration));
      obj.setProperty(runtime, "minVideoDuration", JSIConverter<std::optional<double>>::toJSI(runtime, arg.minVideoDuration));
      obj.setProperty(runtime, "maxFileSize", JSIConverter<std::optional<double>>::toJSI(runtime, arg.maxFileSize));
      obj.setProperty(runtime, "backgroundDark", JSIConverter<std::optional<double>>::toJSI(runtime, arg.backgroundDark));
      obj.setProperty(runtime, "crop", JSIConverter<std::optional<PickerCropConfig>>::toJSI(runtime, arg.crop));
      obj.setProperty(runtime, "text", JSIConverter<std::optional<Text>>::toJSI(runtime, arg.text));
      obj.setProperty(runtime, "language", JSIConverter<Language>::toJSI(runtime, arg.language));
      obj.setProperty(runtime, "theme", JSIConverter<Theme>::toJSI(runtime, arg.theme));
      obj.setProperty(runtime, "presentation", JSIConverter<Presentation>::toJSI(runtime, arg.presentation));
      obj.setProperty(runtime, "camera", JSIConverter<std::optional<PickerCameraConfig>>::toJSI(runtime, arg.camera));
      return obj;
    }
    static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
      if (!value.isObject()) {
        return false;
      }
      jsi::Object obj = value.getObject(runtime);
      if (!JSIConverter<MediaType>::canConvert(runtime, obj.getProperty(runtime, "mediaType"))) return false;
      if (!JSIConverter<std::vector<PickerResult>>::canConvert(runtime, obj.getProperty(runtime, "selectedAssets"))) return false;
      if (!JSIConverter<SelectBoxStyle>::canConvert(runtime, obj.getProperty(runtime, "selectBoxStyle"))) return false;
      if (!JSIConverter<SelectMode>::canConvert(runtime, obj.getProperty(runtime, "selectMode"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "numberOfColumn"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "isPreview"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "primaryColor"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "allowSwipeToSelect"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "spacing"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "isHiddenPreviewButton"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "isHiddenOriginalButton"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "isShowPreviewList"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "allowHapticTouchPreview"))) return false;
      if (!JSIConverter<std::optional<bool>>::canConvert(runtime, obj.getProperty(runtime, "allowedLimit"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "maxVideo"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "maxSelect"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "maxVideoDuration"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "minVideoDuration"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "maxFileSize"))) return false;
      if (!JSIConverter<std::optional<double>>::canConvert(runtime, obj.getProperty(runtime, "backgroundDark"))) return false;
      if (!JSIConverter<std::optional<PickerCropConfig>>::canConvert(runtime, obj.getProperty(runtime, "crop"))) return false;
      if (!JSIConverter<std::optional<Text>>::canConvert(runtime, obj.getProperty(runtime, "text"))) return false;
      if (!JSIConverter<Language>::canConvert(runtime, obj.getProperty(runtime, "language"))) return false;
      if (!JSIConverter<Theme>::canConvert(runtime, obj.getProperty(runtime, "theme"))) return false;
      if (!JSIConverter<Presentation>::canConvert(runtime, obj.getProperty(runtime, "presentation"))) return false;
      if (!JSIConverter<std::optional<PickerCameraConfig>>::canConvert(runtime, obj.getProperty(runtime, "camera"))) return false;
      return true;
    }
  };

} // namespace margelo::nitro
