///
/// JNitroPurchase.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 "NitroPurchase.hpp"

#include "IapPlatform.hpp"
#include "IapStore.hpp"
#include "JIapPlatform.hpp"
#include "JIapStore.hpp"
#include "JNitroRenewalInfoIOS.hpp"
#include "JPurchaseState.hpp"
#include "JVariant_NullType_Boolean.hpp"
#include "JVariant_NullType_Double.hpp"
#include "JVariant_NullType_NitroRenewalInfoIOS.hpp"
#include "JVariant_NullType_String.hpp"
#include "NitroRenewalInfoIOS.hpp"
#include "PurchaseState.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 "NitroPurchase" and the the Kotlin data class "NitroPurchase".
   */
  struct JNitroPurchase final: public jni::JavaClass<JNitroPurchase> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/NitroPurchase;";

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct NitroPurchase by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    NitroPurchase toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldId = clazz->getField<jni::JString>("id");
      jni::local_ref<jni::JString> id = this->getFieldValue(fieldId);
      static const auto fieldProductId = clazz->getField<jni::JString>("productId");
      jni::local_ref<jni::JString> productId = this->getFieldValue(fieldProductId);
      static const auto fieldTransactionDate = clazz->getField<double>("transactionDate");
      double transactionDate = this->getFieldValue(fieldTransactionDate);
      static const auto fieldPurchaseToken = clazz->getField<JVariant_NullType_String>("purchaseToken");
      jni::local_ref<JVariant_NullType_String> purchaseToken = this->getFieldValue(fieldPurchaseToken);
      static const auto fieldPlatform = clazz->getField<JIapPlatform>("platform");
      jni::local_ref<JIapPlatform> platform = this->getFieldValue(fieldPlatform);
      static const auto fieldStore = clazz->getField<JIapStore>("store");
      jni::local_ref<JIapStore> store = this->getFieldValue(fieldStore);
      static const auto fieldQuantity = clazz->getField<double>("quantity");
      double quantity = this->getFieldValue(fieldQuantity);
      static const auto fieldPurchaseState = clazz->getField<JPurchaseState>("purchaseState");
      jni::local_ref<JPurchaseState> purchaseState = this->getFieldValue(fieldPurchaseState);
      static const auto fieldIsAutoRenewing = clazz->getField<jboolean>("isAutoRenewing");
      jboolean isAutoRenewing = this->getFieldValue(fieldIsAutoRenewing);
      static const auto fieldQuantityIOS = clazz->getField<JVariant_NullType_Double>("quantityIOS");
      jni::local_ref<JVariant_NullType_Double> quantityIOS = this->getFieldValue(fieldQuantityIOS);
      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 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 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 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_String>("offerIOS");
      jni::local_ref<JVariant_NullType_String> offerIOS = this->getFieldValue(fieldOfferIOS);
      static const auto fieldOwnershipTypeIOS = clazz->getField<JVariant_NullType_String>("ownershipTypeIOS");
      jni::local_ref<JVariant_NullType_String> ownershipTypeIOS = this->getFieldValue(fieldOwnershipTypeIOS);
      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 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 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 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);
      static const auto fieldRenewalInfoIOS = clazz->getField<JVariant_NullType_NitroRenewalInfoIOS>("renewalInfoIOS");
      jni::local_ref<JVariant_NullType_NitroRenewalInfoIOS> renewalInfoIOS = this->getFieldValue(fieldRenewalInfoIOS);
      static const auto fieldPurchaseTokenAndroid = clazz->getField<JVariant_NullType_String>("purchaseTokenAndroid");
      jni::local_ref<JVariant_NullType_String> purchaseTokenAndroid = this->getFieldValue(fieldPurchaseTokenAndroid);
      static const auto fieldDataAndroid = clazz->getField<JVariant_NullType_String>("dataAndroid");
      jni::local_ref<JVariant_NullType_String> dataAndroid = this->getFieldValue(fieldDataAndroid);
      static const auto fieldSignatureAndroid = clazz->getField<JVariant_NullType_String>("signatureAndroid");
      jni::local_ref<JVariant_NullType_String> signatureAndroid = this->getFieldValue(fieldSignatureAndroid);
      static const auto fieldAutoRenewingAndroid = clazz->getField<JVariant_NullType_Boolean>("autoRenewingAndroid");
      jni::local_ref<JVariant_NullType_Boolean> autoRenewingAndroid = this->getFieldValue(fieldAutoRenewingAndroid);
      static const auto fieldPurchaseStateAndroid = clazz->getField<JVariant_NullType_Double>("purchaseStateAndroid");
      jni::local_ref<JVariant_NullType_Double> purchaseStateAndroid = this->getFieldValue(fieldPurchaseStateAndroid);
      static const auto fieldIsAcknowledgedAndroid = clazz->getField<JVariant_NullType_Boolean>("isAcknowledgedAndroid");
      jni::local_ref<JVariant_NullType_Boolean> isAcknowledgedAndroid = this->getFieldValue(fieldIsAcknowledgedAndroid);
      static const auto fieldPackageNameAndroid = clazz->getField<JVariant_NullType_String>("packageNameAndroid");
      jni::local_ref<JVariant_NullType_String> packageNameAndroid = this->getFieldValue(fieldPackageNameAndroid);
      static const auto fieldObfuscatedAccountIdAndroid = clazz->getField<JVariant_NullType_String>("obfuscatedAccountIdAndroid");
      jni::local_ref<JVariant_NullType_String> obfuscatedAccountIdAndroid = this->getFieldValue(fieldObfuscatedAccountIdAndroid);
      static const auto fieldObfuscatedProfileIdAndroid = clazz->getField<JVariant_NullType_String>("obfuscatedProfileIdAndroid");
      jni::local_ref<JVariant_NullType_String> obfuscatedProfileIdAndroid = this->getFieldValue(fieldObfuscatedProfileIdAndroid);
      static const auto fieldDeveloperPayloadAndroid = clazz->getField<JVariant_NullType_String>("developerPayloadAndroid");
      jni::local_ref<JVariant_NullType_String> developerPayloadAndroid = this->getFieldValue(fieldDeveloperPayloadAndroid);
      static const auto fieldIsSuspendedAndroid = clazz->getField<JVariant_NullType_Boolean>("isSuspendedAndroid");
      jni::local_ref<JVariant_NullType_Boolean> isSuspendedAndroid = this->getFieldValue(fieldIsSuspendedAndroid);
      return NitroPurchase(
        id->toStdString(),
        productId->toStdString(),
        transactionDate,
        purchaseToken != nullptr ? std::make_optional(purchaseToken->toCpp()) : std::nullopt,
        platform->toCpp(),
        store->toCpp(),
        quantity,
        purchaseState->toCpp(),
        static_cast<bool>(isAutoRenewing),
        quantityIOS != nullptr ? std::make_optional(quantityIOS->toCpp()) : std::nullopt,
        originalTransactionDateIOS != nullptr ? std::make_optional(originalTransactionDateIOS->toCpp()) : std::nullopt,
        originalTransactionIdentifierIOS != nullptr ? std::make_optional(originalTransactionIdentifierIOS->toCpp()) : std::nullopt,
        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,
        environmentIOS != nullptr ? std::make_optional(environmentIOS->toCpp()) : std::nullopt,
        expirationDateIOS != nullptr ? std::make_optional(expirationDateIOS->toCpp()) : std::nullopt,
        isUpgradedIOS != nullptr ? std::make_optional(isUpgradedIOS->toCpp()) : std::nullopt,
        offerIOS != nullptr ? std::make_optional(offerIOS->toCpp()) : std::nullopt,
        ownershipTypeIOS != nullptr ? std::make_optional(ownershipTypeIOS->toCpp()) : std::nullopt,
        reasonIOS != nullptr ? std::make_optional(reasonIOS->toCpp()) : std::nullopt,
        reasonStringRepresentationIOS != nullptr ? std::make_optional(reasonStringRepresentationIOS->toCpp()) : std::nullopt,
        revocationDateIOS != nullptr ? std::make_optional(revocationDateIOS->toCpp()) : std::nullopt,
        revocationReasonIOS != nullptr ? std::make_optional(revocationReasonIOS->toCpp()) : std::nullopt,
        storefrontCountryCodeIOS != nullptr ? std::make_optional(storefrontCountryCodeIOS->toCpp()) : std::nullopt,
        subscriptionGroupIdIOS != nullptr ? std::make_optional(subscriptionGroupIdIOS->toCpp()) : std::nullopt,
        transactionReasonIOS != nullptr ? std::make_optional(transactionReasonIOS->toCpp()) : std::nullopt,
        webOrderLineItemIdIOS != nullptr ? std::make_optional(webOrderLineItemIdIOS->toCpp()) : std::nullopt,
        renewalInfoIOS != nullptr ? std::make_optional(renewalInfoIOS->toCpp()) : std::nullopt,
        purchaseTokenAndroid != nullptr ? std::make_optional(purchaseTokenAndroid->toCpp()) : std::nullopt,
        dataAndroid != nullptr ? std::make_optional(dataAndroid->toCpp()) : std::nullopt,
        signatureAndroid != nullptr ? std::make_optional(signatureAndroid->toCpp()) : std::nullopt,
        autoRenewingAndroid != nullptr ? std::make_optional(autoRenewingAndroid->toCpp()) : std::nullopt,
        purchaseStateAndroid != nullptr ? std::make_optional(purchaseStateAndroid->toCpp()) : std::nullopt,
        isAcknowledgedAndroid != nullptr ? std::make_optional(isAcknowledgedAndroid->toCpp()) : std::nullopt,
        packageNameAndroid != nullptr ? std::make_optional(packageNameAndroid->toCpp()) : std::nullopt,
        obfuscatedAccountIdAndroid != nullptr ? std::make_optional(obfuscatedAccountIdAndroid->toCpp()) : std::nullopt,
        obfuscatedProfileIdAndroid != nullptr ? std::make_optional(obfuscatedProfileIdAndroid->toCpp()) : std::nullopt,
        developerPayloadAndroid != nullptr ? std::make_optional(developerPayloadAndroid->toCpp()) : std::nullopt,
        isSuspendedAndroid != nullptr ? std::make_optional(isSuspendedAndroid->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<JNitroPurchase::javaobject> fromCpp(const NitroPurchase& value) {
      using JSignature = JNitroPurchase(jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, double, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JIapPlatform>, jni::alias_ref<JIapStore>, double, jni::alias_ref<JPurchaseState>, jboolean, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_Double>, 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<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_String>, jni::alias_ref<JVariant_NullType_Double>, 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_NitroRenewalInfoIOS>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_Boolean>, 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_String>, jni::alias_ref<JVariant_NullType_Boolean>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        jni::make_jstring(value.id),
        jni::make_jstring(value.productId),
        value.transactionDate,
        value.purchaseToken.has_value() ? JVariant_NullType_String::fromCpp(value.purchaseToken.value()) : nullptr,
        JIapPlatform::fromCpp(value.platform),
        JIapStore::fromCpp(value.store),
        value.quantity,
        JPurchaseState::fromCpp(value.purchaseState),
        value.isAutoRenewing,
        value.quantityIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.quantityIOS.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.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.environmentIOS.has_value() ? JVariant_NullType_String::fromCpp(value.environmentIOS.value()) : nullptr,
        value.expirationDateIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.expirationDateIOS.value()) : nullptr,
        value.isUpgradedIOS.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isUpgradedIOS.value()) : nullptr,
        value.offerIOS.has_value() ? JVariant_NullType_String::fromCpp(value.offerIOS.value()) : nullptr,
        value.ownershipTypeIOS.has_value() ? JVariant_NullType_String::fromCpp(value.ownershipTypeIOS.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.revocationDateIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.revocationDateIOS.value()) : nullptr,
        value.revocationReasonIOS.has_value() ? JVariant_NullType_String::fromCpp(value.revocationReasonIOS.value()) : nullptr,
        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.transactionReasonIOS.has_value() ? JVariant_NullType_String::fromCpp(value.transactionReasonIOS.value()) : nullptr,
        value.webOrderLineItemIdIOS.has_value() ? JVariant_NullType_String::fromCpp(value.webOrderLineItemIdIOS.value()) : nullptr,
        value.renewalInfoIOS.has_value() ? JVariant_NullType_NitroRenewalInfoIOS::fromCpp(value.renewalInfoIOS.value()) : nullptr,
        value.purchaseTokenAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.purchaseTokenAndroid.value()) : nullptr,
        value.dataAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.dataAndroid.value()) : nullptr,
        value.signatureAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.signatureAndroid.value()) : nullptr,
        value.autoRenewingAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.autoRenewingAndroid.value()) : nullptr,
        value.purchaseStateAndroid.has_value() ? JVariant_NullType_Double::fromCpp(value.purchaseStateAndroid.value()) : nullptr,
        value.isAcknowledgedAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isAcknowledgedAndroid.value()) : nullptr,
        value.packageNameAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.packageNameAndroid.value()) : nullptr,
        value.obfuscatedAccountIdAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.obfuscatedAccountIdAndroid.value()) : nullptr,
        value.obfuscatedProfileIdAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.obfuscatedProfileIdAndroid.value()) : nullptr,
        value.developerPayloadAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.developerPayloadAndroid.value()) : nullptr,
        value.isSuspendedAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isSuspendedAndroid.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::iap
