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

#pragma once

#include <fbjni/fbjni.h>
#include "NitroOneTimePurchaseOfferDetail.hpp"

#include "JNitroDiscountAmountAndroid.hpp"
#include "JNitroDiscountDisplayInfoAndroid.hpp"
#include "JNitroLimitedQuantityInfoAndroid.hpp"
#include "JNitroPreorderDetailsAndroid.hpp"
#include "JNitroRentalDetailsAndroid.hpp"
#include "JNitroValidTimeWindowAndroid.hpp"
#include "JVariant_NullType_Double.hpp"
#include "JVariant_NullType_NitroDiscountAmountAndroid.hpp"
#include "JVariant_NullType_NitroDiscountDisplayInfoAndroid.hpp"
#include "JVariant_NullType_NitroLimitedQuantityInfoAndroid.hpp"
#include "JVariant_NullType_NitroPreorderDetailsAndroid.hpp"
#include "JVariant_NullType_NitroRentalDetailsAndroid.hpp"
#include "JVariant_NullType_NitroValidTimeWindowAndroid.hpp"
#include "JVariant_NullType_String.hpp"
#include "NitroDiscountAmountAndroid.hpp"
#include "NitroDiscountDisplayInfoAndroid.hpp"
#include "NitroLimitedQuantityInfoAndroid.hpp"
#include "NitroPreorderDetailsAndroid.hpp"
#include "NitroRentalDetailsAndroid.hpp"
#include "NitroValidTimeWindowAndroid.hpp"
#include <NitroModules/JNull.hpp>
#include <NitroModules/Null.hpp>
#include <optional>
#include <string>
#include <variant>
#include <vector>

namespace margelo::nitro::iap {

  using namespace facebook;

  /**
   * The C++ JNI bridge between the C++ struct "NitroOneTimePurchaseOfferDetail" and the the Kotlin data class "NitroOneTimePurchaseOfferDetail".
   */
  struct JNitroOneTimePurchaseOfferDetail final: public jni::JavaClass<JNitroOneTimePurchaseOfferDetail> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail;";

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct NitroOneTimePurchaseOfferDetail by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    NitroOneTimePurchaseOfferDetail toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldDiscountDisplayInfo = clazz->getField<JVariant_NullType_NitroDiscountDisplayInfoAndroid>("discountDisplayInfo");
      jni::local_ref<JVariant_NullType_NitroDiscountDisplayInfoAndroid> discountDisplayInfo = this->getFieldValue(fieldDiscountDisplayInfo);
      static const auto fieldFormattedPrice = clazz->getField<jni::JString>("formattedPrice");
      jni::local_ref<jni::JString> formattedPrice = this->getFieldValue(fieldFormattedPrice);
      static const auto fieldFullPriceMicros = clazz->getField<JVariant_NullType_String>("fullPriceMicros");
      jni::local_ref<JVariant_NullType_String> fullPriceMicros = this->getFieldValue(fieldFullPriceMicros);
      static const auto fieldLimitedQuantityInfo = clazz->getField<JVariant_NullType_NitroLimitedQuantityInfoAndroid>("limitedQuantityInfo");
      jni::local_ref<JVariant_NullType_NitroLimitedQuantityInfoAndroid> limitedQuantityInfo = this->getFieldValue(fieldLimitedQuantityInfo);
      static const auto fieldOfferId = clazz->getField<JVariant_NullType_String>("offerId");
      jni::local_ref<JVariant_NullType_String> offerId = this->getFieldValue(fieldOfferId);
      static const auto fieldOfferTags = clazz->getField<jni::JArrayClass<jni::JString>>("offerTags");
      jni::local_ref<jni::JArrayClass<jni::JString>> offerTags = this->getFieldValue(fieldOfferTags);
      static const auto fieldOfferToken = clazz->getField<jni::JString>("offerToken");
      jni::local_ref<jni::JString> offerToken = this->getFieldValue(fieldOfferToken);
      static const auto fieldPreorderDetailsAndroid = clazz->getField<JVariant_NullType_NitroPreorderDetailsAndroid>("preorderDetailsAndroid");
      jni::local_ref<JVariant_NullType_NitroPreorderDetailsAndroid> preorderDetailsAndroid = this->getFieldValue(fieldPreorderDetailsAndroid);
      static const auto fieldPriceAmountMicros = clazz->getField<jni::JString>("priceAmountMicros");
      jni::local_ref<jni::JString> priceAmountMicros = this->getFieldValue(fieldPriceAmountMicros);
      static const auto fieldPriceCurrencyCode = clazz->getField<jni::JString>("priceCurrencyCode");
      jni::local_ref<jni::JString> priceCurrencyCode = this->getFieldValue(fieldPriceCurrencyCode);
      static const auto fieldRentalDetailsAndroid = clazz->getField<JVariant_NullType_NitroRentalDetailsAndroid>("rentalDetailsAndroid");
      jni::local_ref<JVariant_NullType_NitroRentalDetailsAndroid> rentalDetailsAndroid = this->getFieldValue(fieldRentalDetailsAndroid);
      static const auto fieldValidTimeWindow = clazz->getField<JVariant_NullType_NitroValidTimeWindowAndroid>("validTimeWindow");
      jni::local_ref<JVariant_NullType_NitroValidTimeWindowAndroid> validTimeWindow = this->getFieldValue(fieldValidTimeWindow);
      return NitroOneTimePurchaseOfferDetail(
        discountDisplayInfo != nullptr ? std::make_optional(discountDisplayInfo->toCpp()) : std::nullopt,
        formattedPrice->toStdString(),
        fullPriceMicros != nullptr ? std::make_optional(fullPriceMicros->toCpp()) : std::nullopt,
        limitedQuantityInfo != nullptr ? std::make_optional(limitedQuantityInfo->toCpp()) : std::nullopt,
        offerId != nullptr ? std::make_optional(offerId->toCpp()) : std::nullopt,
        [&]() {
          size_t __size = offerTags->size();
          std::vector<std::string> __vector;
          __vector.reserve(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            auto __element = offerTags->getElement(__i);
            __vector.push_back(__element->toStdString());
          }
          return __vector;
        }(),
        offerToken->toStdString(),
        preorderDetailsAndroid != nullptr ? std::make_optional(preorderDetailsAndroid->toCpp()) : std::nullopt,
        priceAmountMicros->toStdString(),
        priceCurrencyCode->toStdString(),
        rentalDetailsAndroid != nullptr ? std::make_optional(rentalDetailsAndroid->toCpp()) : std::nullopt,
        validTimeWindow != nullptr ? std::make_optional(validTimeWindow->toCpp()) : std::nullopt
      );
    }

  public:
    /**
     * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
     */
    [[maybe_unused]]
    static jni::local_ref<JNitroOneTimePurchaseOfferDetail::javaobject> fromCpp(const NitroOneTimePurchaseOfferDetail& value) {
      using JSignature = JNitroOneTimePurchaseOfferDetail(jni::alias_ref<JVariant_NullType_NitroDiscountDisplayInfoAndroid>, jni::alias_ref<jni::JString>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_NitroLimitedQuantityInfoAndroid>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<jni::JArrayClass<jni::JString>>, jni::alias_ref<jni::JString>, jni::alias_ref<JVariant_NullType_NitroPreorderDetailsAndroid>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<JVariant_NullType_NitroRentalDetailsAndroid>, jni::alias_ref<JVariant_NullType_NitroValidTimeWindowAndroid>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        value.discountDisplayInfo.has_value() ? JVariant_NullType_NitroDiscountDisplayInfoAndroid::fromCpp(value.discountDisplayInfo.value()) : nullptr,
        jni::make_jstring(value.formattedPrice),
        value.fullPriceMicros.has_value() ? JVariant_NullType_String::fromCpp(value.fullPriceMicros.value()) : nullptr,
        value.limitedQuantityInfo.has_value() ? JVariant_NullType_NitroLimitedQuantityInfoAndroid::fromCpp(value.limitedQuantityInfo.value()) : nullptr,
        value.offerId.has_value() ? JVariant_NullType_String::fromCpp(value.offerId.value()) : nullptr,
        [&]() {
          size_t __size = value.offerTags.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 = value.offerTags[__i];
            auto __elementJni = jni::make_jstring(__element);
            __array->setElement(__i, *__elementJni);
          }
          return __array;
        }(),
        jni::make_jstring(value.offerToken),
        value.preorderDetailsAndroid.has_value() ? JVariant_NullType_NitroPreorderDetailsAndroid::fromCpp(value.preorderDetailsAndroid.value()) : nullptr,
        jni::make_jstring(value.priceAmountMicros),
        jni::make_jstring(value.priceCurrencyCode),
        value.rentalDetailsAndroid.has_value() ? JVariant_NullType_NitroRentalDetailsAndroid::fromCpp(value.rentalDetailsAndroid.value()) : nullptr,
        value.validTimeWindow.has_value() ? JVariant_NullType_NitroValidTimeWindowAndroid::fromCpp(value.validTimeWindow.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::iap
