///
/// JRenewalInfoIOS.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 "RenewalInfoIOS.hpp"

#include "JVariant_NullType_Boolean.hpp"
#include "JVariant_NullType_Double.hpp"
#include "JVariant_NullType_String.hpp"
#include <NitroModules/JNull.hpp>
#include <NitroModules/Null.hpp>
#include <optional>
#include <string>
#include <variant>

namespace margelo::nitro::iap {

  using namespace facebook;

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

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct RenewalInfoIOS by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    RenewalInfoIOS toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldAutoRenewPreference = clazz->getField<JVariant_NullType_String>("autoRenewPreference");
      jni::local_ref<JVariant_NullType_String> autoRenewPreference = this->getFieldValue(fieldAutoRenewPreference);
      static const auto fieldExpirationReason = clazz->getField<JVariant_NullType_String>("expirationReason");
      jni::local_ref<JVariant_NullType_String> expirationReason = this->getFieldValue(fieldExpirationReason);
      static const auto fieldGracePeriodExpirationDate = clazz->getField<JVariant_NullType_Double>("gracePeriodExpirationDate");
      jni::local_ref<JVariant_NullType_Double> gracePeriodExpirationDate = this->getFieldValue(fieldGracePeriodExpirationDate);
      static const auto fieldIsInBillingRetry = clazz->getField<JVariant_NullType_Boolean>("isInBillingRetry");
      jni::local_ref<JVariant_NullType_Boolean> isInBillingRetry = this->getFieldValue(fieldIsInBillingRetry);
      static const auto fieldJsonRepresentation = clazz->getField<JVariant_NullType_String>("jsonRepresentation");
      jni::local_ref<JVariant_NullType_String> jsonRepresentation = this->getFieldValue(fieldJsonRepresentation);
      static const auto fieldPendingUpgradeProductId = clazz->getField<JVariant_NullType_String>("pendingUpgradeProductId");
      jni::local_ref<JVariant_NullType_String> pendingUpgradeProductId = this->getFieldValue(fieldPendingUpgradeProductId);
      static const auto fieldPriceIncreaseStatus = clazz->getField<JVariant_NullType_String>("priceIncreaseStatus");
      jni::local_ref<JVariant_NullType_String> priceIncreaseStatus = this->getFieldValue(fieldPriceIncreaseStatus);
      static const auto fieldRenewalDate = clazz->getField<JVariant_NullType_Double>("renewalDate");
      jni::local_ref<JVariant_NullType_Double> renewalDate = this->getFieldValue(fieldRenewalDate);
      static const auto fieldRenewalOfferId = clazz->getField<JVariant_NullType_String>("renewalOfferId");
      jni::local_ref<JVariant_NullType_String> renewalOfferId = this->getFieldValue(fieldRenewalOfferId);
      static const auto fieldRenewalOfferType = clazz->getField<JVariant_NullType_String>("renewalOfferType");
      jni::local_ref<JVariant_NullType_String> renewalOfferType = this->getFieldValue(fieldRenewalOfferType);
      static const auto fieldWillAutoRenew = clazz->getField<jboolean>("willAutoRenew");
      jboolean willAutoRenew = this->getFieldValue(fieldWillAutoRenew);
      return RenewalInfoIOS(
        autoRenewPreference != nullptr ? std::make_optional(autoRenewPreference->toCpp()) : std::nullopt,
        expirationReason != nullptr ? std::make_optional(expirationReason->toCpp()) : std::nullopt,
        gracePeriodExpirationDate != nullptr ? std::make_optional(gracePeriodExpirationDate->toCpp()) : std::nullopt,
        isInBillingRetry != nullptr ? std::make_optional(isInBillingRetry->toCpp()) : std::nullopt,
        jsonRepresentation != nullptr ? std::make_optional(jsonRepresentation->toCpp()) : std::nullopt,
        pendingUpgradeProductId != nullptr ? std::make_optional(pendingUpgradeProductId->toCpp()) : std::nullopt,
        priceIncreaseStatus != nullptr ? std::make_optional(priceIncreaseStatus->toCpp()) : std::nullopt,
        renewalDate != nullptr ? std::make_optional(renewalDate->toCpp()) : std::nullopt,
        renewalOfferId != nullptr ? std::make_optional(renewalOfferId->toCpp()) : std::nullopt,
        renewalOfferType != nullptr ? std::make_optional(renewalOfferType->toCpp()) : std::nullopt,
        static_cast<bool>(willAutoRenew)
      );
    }

  public:
    /**
     * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
     */
    [[maybe_unused]]
    static jni::local_ref<JRenewalInfoIOS::javaobject> fromCpp(const RenewalInfoIOS& value) {
      using JSignature = JRenewalInfoIOS(jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_Boolean>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jboolean);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        value.autoRenewPreference.has_value() ? JVariant_NullType_String::fromCpp(value.autoRenewPreference.value()) : nullptr,
        value.expirationReason.has_value() ? JVariant_NullType_String::fromCpp(value.expirationReason.value()) : nullptr,
        value.gracePeriodExpirationDate.has_value() ? JVariant_NullType_Double::fromCpp(value.gracePeriodExpirationDate.value()) : nullptr,
        value.isInBillingRetry.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isInBillingRetry.value()) : nullptr,
        value.jsonRepresentation.has_value() ? JVariant_NullType_String::fromCpp(value.jsonRepresentation.value()) : nullptr,
        value.pendingUpgradeProductId.has_value() ? JVariant_NullType_String::fromCpp(value.pendingUpgradeProductId.value()) : nullptr,
        value.priceIncreaseStatus.has_value() ? JVariant_NullType_String::fromCpp(value.priceIncreaseStatus.value()) : nullptr,
        value.renewalDate.has_value() ? JVariant_NullType_Double::fromCpp(value.renewalDate.value()) : nullptr,
        value.renewalOfferId.has_value() ? JVariant_NullType_String::fromCpp(value.renewalOfferId.value()) : nullptr,
        value.renewalOfferType.has_value() ? JVariant_NullType_String::fromCpp(value.renewalOfferType.value()) : nullptr,
        value.willAutoRenew
      );
    }
  };

} // namespace margelo::nitro::iap
