///
/// JPurchaseIOS.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 "PurchaseIOS.hpp"

#include "IapPlatform.hpp"
#include "IapStore.hpp"
#include "JIapPlatform.hpp"
#include "JIapStore.hpp"
#include "JPurchaseOfferIOS.hpp"
#include "JPurchaseState.hpp"
#include "JRenewalInfoIOS.hpp"
#include "JVariant_NullType_Array_String_.hpp"
#include "JVariant_NullType_Boolean.hpp"
#include "JVariant_NullType_Double.hpp"
#include "JVariant_NullType_PurchaseOfferIOS.hpp"
#include "JVariant_NullType_RenewalInfoIOS.hpp"
#include "JVariant_NullType_String.hpp"
#include "PurchaseOfferIOS.hpp"
#include "PurchaseState.hpp"
#include "RenewalInfoIOS.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 "PurchaseIOS" and the the Kotlin data class "PurchaseIOS".
   */
  struct JPurchaseIOS final: public jni::JavaClass<JPurchaseIOS> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/PurchaseIOS;";

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct PurchaseIOS by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    PurchaseIOS toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldAppAccountToken = clazz->getField<JVariant_NullType_String>("appAccountToken");
      jni::local_ref<JVariant_NullType_String> appAccountToken = this->getFieldValue(fieldAppAccountToken);
      static const auto fieldAppBundleIdIOS = clazz->getField<JVariant_NullType_String>("appBundleIdIOS");
      jni::local_ref<JVariant_NullType_String> appBundleIdIOS = this->getFieldValue(fieldAppBundleIdIOS);
      static const auto fieldCountryCodeIOS = clazz->getField<JVariant_NullType_String>("countryCodeIOS");
      jni::local_ref<JVariant_NullType_String> countryCodeIOS = this->getFieldValue(fieldCountryCodeIOS);
      static const auto fieldCurrencyCodeIOS = clazz->getField<JVariant_NullType_String>("currencyCodeIOS");
      jni::local_ref<JVariant_NullType_String> currencyCodeIOS = this->getFieldValue(fieldCurrencyCodeIOS);
      static const auto fieldCurrencySymbolIOS = clazz->getField<JVariant_NullType_String>("currencySymbolIOS");
      jni::local_ref<JVariant_NullType_String> currencySymbolIOS = this->getFieldValue(fieldCurrencySymbolIOS);
      static const auto fieldCurrentPlanId = clazz->getField<JVariant_NullType_String>("currentPlanId");
      jni::local_ref<JVariant_NullType_String> currentPlanId = this->getFieldValue(fieldCurrentPlanId);
      static const auto fieldEnvironmentIOS = clazz->getField<JVariant_NullType_String>("environmentIOS");
      jni::local_ref<JVariant_NullType_String> environmentIOS = this->getFieldValue(fieldEnvironmentIOS);
      static const auto fieldExpirationDateIOS = clazz->getField<JVariant_NullType_Double>("expirationDateIOS");
      jni::local_ref<JVariant_NullType_Double> expirationDateIOS = this->getFieldValue(fieldExpirationDateIOS);
      static const auto fieldId = clazz->getField<jni::JString>("id");
      jni::local_ref<jni::JString> id = this->getFieldValue(fieldId);
      static const auto fieldIds = clazz->getField<JVariant_NullType_Array_String_>("ids");
      jni::local_ref<JVariant_NullType_Array_String_> ids = this->getFieldValue(fieldIds);
      static const auto fieldIsAutoRenewing = clazz->getField<jboolean>("isAutoRenewing");
      jboolean isAutoRenewing = this->getFieldValue(fieldIsAutoRenewing);
      static const auto fieldIsUpgradedIOS = clazz->getField<JVariant_NullType_Boolean>("isUpgradedIOS");
      jni::local_ref<JVariant_NullType_Boolean> isUpgradedIOS = this->getFieldValue(fieldIsUpgradedIOS);
      static const auto fieldOfferIOS = clazz->getField<JVariant_NullType_PurchaseOfferIOS>("offerIOS");
      jni::local_ref<JVariant_NullType_PurchaseOfferIOS> offerIOS = this->getFieldValue(fieldOfferIOS);
      static const auto fieldOriginalTransactionDateIOS = clazz->getField<JVariant_NullType_Double>("originalTransactionDateIOS");
      jni::local_ref<JVariant_NullType_Double> originalTransactionDateIOS = this->getFieldValue(fieldOriginalTransactionDateIOS);
      static const auto fieldOriginalTransactionIdentifierIOS = clazz->getField<JVariant_NullType_String>("originalTransactionIdentifierIOS");
      jni::local_ref<JVariant_NullType_String> originalTransactionIdentifierIOS = this->getFieldValue(fieldOriginalTransactionIdentifierIOS);
      static const auto fieldOwnershipTypeIOS = clazz->getField<JVariant_NullType_String>("ownershipTypeIOS");
      jni::local_ref<JVariant_NullType_String> ownershipTypeIOS = this->getFieldValue(fieldOwnershipTypeIOS);
      static const auto fieldPlatform = clazz->getField<JIapPlatform>("platform");
      jni::local_ref<JIapPlatform> platform = this->getFieldValue(fieldPlatform);
      static const auto fieldProductId = clazz->getField<jni::JString>("productId");
      jni::local_ref<jni::JString> productId = this->getFieldValue(fieldProductId);
      static const auto fieldPurchaseState = clazz->getField<JPurchaseState>("purchaseState");
      jni::local_ref<JPurchaseState> purchaseState = this->getFieldValue(fieldPurchaseState);
      static const auto fieldPurchaseToken = clazz->getField<JVariant_NullType_String>("purchaseToken");
      jni::local_ref<JVariant_NullType_String> purchaseToken = this->getFieldValue(fieldPurchaseToken);
      static const auto fieldQuantity = clazz->getField<double>("quantity");
      double quantity = this->getFieldValue(fieldQuantity);
      static const auto fieldQuantityIOS = clazz->getField<JVariant_NullType_Double>("quantityIOS");
      jni::local_ref<JVariant_NullType_Double> quantityIOS = this->getFieldValue(fieldQuantityIOS);
      static const auto fieldReasonIOS = clazz->getField<JVariant_NullType_String>("reasonIOS");
      jni::local_ref<JVariant_NullType_String> reasonIOS = this->getFieldValue(fieldReasonIOS);
      static const auto fieldReasonStringRepresentationIOS = clazz->getField<JVariant_NullType_String>("reasonStringRepresentationIOS");
      jni::local_ref<JVariant_NullType_String> reasonStringRepresentationIOS = this->getFieldValue(fieldReasonStringRepresentationIOS);
      static const auto fieldRenewalInfoIOS = clazz->getField<JVariant_NullType_RenewalInfoIOS>("renewalInfoIOS");
      jni::local_ref<JVariant_NullType_RenewalInfoIOS> renewalInfoIOS = this->getFieldValue(fieldRenewalInfoIOS);
      static const auto fieldRevocationDateIOS = clazz->getField<JVariant_NullType_Double>("revocationDateIOS");
      jni::local_ref<JVariant_NullType_Double> revocationDateIOS = this->getFieldValue(fieldRevocationDateIOS);
      static const auto fieldRevocationReasonIOS = clazz->getField<JVariant_NullType_String>("revocationReasonIOS");
      jni::local_ref<JVariant_NullType_String> revocationReasonIOS = this->getFieldValue(fieldRevocationReasonIOS);
      static const auto fieldStore = clazz->getField<JIapStore>("store");
      jni::local_ref<JIapStore> store = this->getFieldValue(fieldStore);
      static const auto fieldStorefrontCountryCodeIOS = clazz->getField<JVariant_NullType_String>("storefrontCountryCodeIOS");
      jni::local_ref<JVariant_NullType_String> storefrontCountryCodeIOS = this->getFieldValue(fieldStorefrontCountryCodeIOS);
      static const auto fieldSubscriptionGroupIdIOS = clazz->getField<JVariant_NullType_String>("subscriptionGroupIdIOS");
      jni::local_ref<JVariant_NullType_String> subscriptionGroupIdIOS = this->getFieldValue(fieldSubscriptionGroupIdIOS);
      static const auto fieldTransactionDate = clazz->getField<double>("transactionDate");
      double transactionDate = this->getFieldValue(fieldTransactionDate);
      static const auto fieldTransactionId = clazz->getField<jni::JString>("transactionId");
      jni::local_ref<jni::JString> transactionId = this->getFieldValue(fieldTransactionId);
      static const auto fieldTransactionReasonIOS = clazz->getField<JVariant_NullType_String>("transactionReasonIOS");
      jni::local_ref<JVariant_NullType_String> transactionReasonIOS = this->getFieldValue(fieldTransactionReasonIOS);
      static const auto fieldWebOrderLineItemIdIOS = clazz->getField<JVariant_NullType_String>("webOrderLineItemIdIOS");
      jni::local_ref<JVariant_NullType_String> webOrderLineItemIdIOS = this->getFieldValue(fieldWebOrderLineItemIdIOS);
      return PurchaseIOS(
        appAccountToken != nullptr ? std::make_optional(appAccountToken->toCpp()) : std::nullopt,
        appBundleIdIOS != nullptr ? std::make_optional(appBundleIdIOS->toCpp()) : std::nullopt,
        countryCodeIOS != nullptr ? std::make_optional(countryCodeIOS->toCpp()) : std::nullopt,
        currencyCodeIOS != nullptr ? std::make_optional(currencyCodeIOS->toCpp()) : std::nullopt,
        currencySymbolIOS != nullptr ? std::make_optional(currencySymbolIOS->toCpp()) : std::nullopt,
        currentPlanId != nullptr ? std::make_optional(currentPlanId->toCpp()) : std::nullopt,
        environmentIOS != nullptr ? std::make_optional(environmentIOS->toCpp()) : std::nullopt,
        expirationDateIOS != nullptr ? std::make_optional(expirationDateIOS->toCpp()) : std::nullopt,
        id->toStdString(),
        ids != nullptr ? std::make_optional(ids->toCpp()) : std::nullopt,
        static_cast<bool>(isAutoRenewing),
        isUpgradedIOS != nullptr ? std::make_optional(isUpgradedIOS->toCpp()) : std::nullopt,
        offerIOS != nullptr ? std::make_optional(offerIOS->toCpp()) : std::nullopt,
        originalTransactionDateIOS != nullptr ? std::make_optional(originalTransactionDateIOS->toCpp()) : std::nullopt,
        originalTransactionIdentifierIOS != nullptr ? std::make_optional(originalTransactionIdentifierIOS->toCpp()) : std::nullopt,
        ownershipTypeIOS != nullptr ? std::make_optional(ownershipTypeIOS->toCpp()) : std::nullopt,
        platform->toCpp(),
        productId->toStdString(),
        purchaseState->toCpp(),
        purchaseToken != nullptr ? std::make_optional(purchaseToken->toCpp()) : std::nullopt,
        quantity,
        quantityIOS != nullptr ? std::make_optional(quantityIOS->toCpp()) : std::nullopt,
        reasonIOS != nullptr ? std::make_optional(reasonIOS->toCpp()) : std::nullopt,
        reasonStringRepresentationIOS != nullptr ? std::make_optional(reasonStringRepresentationIOS->toCpp()) : std::nullopt,
        renewalInfoIOS != nullptr ? std::make_optional(renewalInfoIOS->toCpp()) : std::nullopt,
        revocationDateIOS != nullptr ? std::make_optional(revocationDateIOS->toCpp()) : std::nullopt,
        revocationReasonIOS != nullptr ? std::make_optional(revocationReasonIOS->toCpp()) : std::nullopt,
        store->toCpp(),
        storefrontCountryCodeIOS != nullptr ? std::make_optional(storefrontCountryCodeIOS->toCpp()) : std::nullopt,
        subscriptionGroupIdIOS != nullptr ? std::make_optional(subscriptionGroupIdIOS->toCpp()) : std::nullopt,
        transactionDate,
        transactionId->toStdString(),
        transactionReasonIOS != nullptr ? std::make_optional(transactionReasonIOS->toCpp()) : std::nullopt,
        webOrderLineItemIdIOS != nullptr ? std::make_optional(webOrderLineItemIdIOS->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<JPurchaseIOS::javaobject> fromCpp(const PurchaseIOS& value) {
      using JSignature = JPurchaseIOS(jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, 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<jni::JString>, jni::alias_ref<JVariant_NullType_Array_String_>, jboolean, jni::alias_ref<JVariant_NullType_Boolean>, jni::alias_ref<JVariant_NullType_PurchaseOfferIOS>, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JIapPlatform>, jni::alias_ref<jni::JString>, jni::alias_ref<JPurchaseState>, jni::alias_ref<JVariant_NullType_String>, double, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_RenewalInfoIOS>, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JIapStore>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, double, jni::alias_ref<jni::JString>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        value.appAccountToken.has_value() ? JVariant_NullType_String::fromCpp(value.appAccountToken.value()) : nullptr,
        value.appBundleIdIOS.has_value() ? JVariant_NullType_String::fromCpp(value.appBundleIdIOS.value()) : nullptr,
        value.countryCodeIOS.has_value() ? JVariant_NullType_String::fromCpp(value.countryCodeIOS.value()) : nullptr,
        value.currencyCodeIOS.has_value() ? JVariant_NullType_String::fromCpp(value.currencyCodeIOS.value()) : nullptr,
        value.currencySymbolIOS.has_value() ? JVariant_NullType_String::fromCpp(value.currencySymbolIOS.value()) : nullptr,
        value.currentPlanId.has_value() ? JVariant_NullType_String::fromCpp(value.currentPlanId.value()) : nullptr,
        value.environmentIOS.has_value() ? JVariant_NullType_String::fromCpp(value.environmentIOS.value()) : nullptr,
        value.expirationDateIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.expirationDateIOS.value()) : nullptr,
        jni::make_jstring(value.id),
        value.ids.has_value() ? JVariant_NullType_Array_String_::fromCpp(value.ids.value()) : nullptr,
        value.isAutoRenewing,
        value.isUpgradedIOS.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isUpgradedIOS.value()) : nullptr,
        value.offerIOS.has_value() ? JVariant_NullType_PurchaseOfferIOS::fromCpp(value.offerIOS.value()) : nullptr,
        value.originalTransactionDateIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.originalTransactionDateIOS.value()) : nullptr,
        value.originalTransactionIdentifierIOS.has_value() ? JVariant_NullType_String::fromCpp(value.originalTransactionIdentifierIOS.value()) : nullptr,
        value.ownershipTypeIOS.has_value() ? JVariant_NullType_String::fromCpp(value.ownershipTypeIOS.value()) : nullptr,
        JIapPlatform::fromCpp(value.platform),
        jni::make_jstring(value.productId),
        JPurchaseState::fromCpp(value.purchaseState),
        value.purchaseToken.has_value() ? JVariant_NullType_String::fromCpp(value.purchaseToken.value()) : nullptr,
        value.quantity,
        value.quantityIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.quantityIOS.value()) : nullptr,
        value.reasonIOS.has_value() ? JVariant_NullType_String::fromCpp(value.reasonIOS.value()) : nullptr,
        value.reasonStringRepresentationIOS.has_value() ? JVariant_NullType_String::fromCpp(value.reasonStringRepresentationIOS.value()) : nullptr,
        value.renewalInfoIOS.has_value() ? JVariant_NullType_RenewalInfoIOS::fromCpp(value.renewalInfoIOS.value()) : nullptr,
        value.revocationDateIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.revocationDateIOS.value()) : nullptr,
        value.revocationReasonIOS.has_value() ? JVariant_NullType_String::fromCpp(value.revocationReasonIOS.value()) : nullptr,
        JIapStore::fromCpp(value.store),
        value.storefrontCountryCodeIOS.has_value() ? JVariant_NullType_String::fromCpp(value.storefrontCountryCodeIOS.value()) : nullptr,
        value.subscriptionGroupIdIOS.has_value() ? JVariant_NullType_String::fromCpp(value.subscriptionGroupIdIOS.value()) : nullptr,
        value.transactionDate,
        jni::make_jstring(value.transactionId),
        value.transactionReasonIOS.has_value() ? JVariant_NullType_String::fromCpp(value.transactionReasonIOS.value()) : nullptr,
        value.webOrderLineItemIdIOS.has_value() ? JVariant_NullType_String::fromCpp(value.webOrderLineItemIdIOS.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::iap
