///
/// JPurchaseAndroid.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 "PurchaseAndroid.hpp"

#include "IapPlatform.hpp"
#include "IapStore.hpp"
#include "JIapPlatform.hpp"
#include "JIapStore.hpp"
#include "JPendingPurchaseUpdateAndroid.hpp"
#include "JPurchaseState.hpp"
#include "JVariant_NullType_Array_String_.hpp"
#include "JVariant_NullType_Boolean.hpp"
#include "JVariant_NullType_PendingPurchaseUpdateAndroid.hpp"
#include "JVariant_NullType_String.hpp"
#include "PendingPurchaseUpdateAndroid.hpp"
#include "PurchaseState.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 "PurchaseAndroid" and the the Kotlin data class "PurchaseAndroid".
   */
  struct JPurchaseAndroid final: public jni::JavaClass<JPurchaseAndroid> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/PurchaseAndroid;";

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct PurchaseAndroid by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    PurchaseAndroid toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldAutoRenewingAndroid = clazz->getField<JVariant_NullType_Boolean>("autoRenewingAndroid");
      jni::local_ref<JVariant_NullType_Boolean> autoRenewingAndroid = this->getFieldValue(fieldAutoRenewingAndroid);
      static const auto fieldCurrentPlanId = clazz->getField<JVariant_NullType_String>("currentPlanId");
      jni::local_ref<JVariant_NullType_String> currentPlanId = this->getFieldValue(fieldCurrentPlanId);
      static const auto fieldDataAndroid = clazz->getField<JVariant_NullType_String>("dataAndroid");
      jni::local_ref<JVariant_NullType_String> dataAndroid = this->getFieldValue(fieldDataAndroid);
      static const auto fieldDeveloperPayloadAndroid = clazz->getField<JVariant_NullType_String>("developerPayloadAndroid");
      jni::local_ref<JVariant_NullType_String> developerPayloadAndroid = this->getFieldValue(fieldDeveloperPayloadAndroid);
      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 fieldIsAcknowledgedAndroid = clazz->getField<JVariant_NullType_Boolean>("isAcknowledgedAndroid");
      jni::local_ref<JVariant_NullType_Boolean> isAcknowledgedAndroid = this->getFieldValue(fieldIsAcknowledgedAndroid);
      static const auto fieldIsAutoRenewing = clazz->getField<jboolean>("isAutoRenewing");
      jboolean isAutoRenewing = this->getFieldValue(fieldIsAutoRenewing);
      static const auto fieldIsSuspendedAndroid = clazz->getField<JVariant_NullType_Boolean>("isSuspendedAndroid");
      jni::local_ref<JVariant_NullType_Boolean> isSuspendedAndroid = this->getFieldValue(fieldIsSuspendedAndroid);
      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 fieldPackageNameAndroid = clazz->getField<JVariant_NullType_String>("packageNameAndroid");
      jni::local_ref<JVariant_NullType_String> packageNameAndroid = this->getFieldValue(fieldPackageNameAndroid);
      static const auto fieldPendingPurchaseUpdateAndroid = clazz->getField<JVariant_NullType_PendingPurchaseUpdateAndroid>("pendingPurchaseUpdateAndroid");
      jni::local_ref<JVariant_NullType_PendingPurchaseUpdateAndroid> pendingPurchaseUpdateAndroid = this->getFieldValue(fieldPendingPurchaseUpdateAndroid);
      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 fieldSignatureAndroid = clazz->getField<JVariant_NullType_String>("signatureAndroid");
      jni::local_ref<JVariant_NullType_String> signatureAndroid = this->getFieldValue(fieldSignatureAndroid);
      static const auto fieldStore = clazz->getField<JIapStore>("store");
      jni::local_ref<JIapStore> store = this->getFieldValue(fieldStore);
      static const auto fieldTransactionDate = clazz->getField<double>("transactionDate");
      double transactionDate = this->getFieldValue(fieldTransactionDate);
      static const auto fieldTransactionId = clazz->getField<JVariant_NullType_String>("transactionId");
      jni::local_ref<JVariant_NullType_String> transactionId = this->getFieldValue(fieldTransactionId);
      return PurchaseAndroid(
        autoRenewingAndroid != nullptr ? std::make_optional(autoRenewingAndroid->toCpp()) : std::nullopt,
        currentPlanId != nullptr ? std::make_optional(currentPlanId->toCpp()) : std::nullopt,
        dataAndroid != nullptr ? std::make_optional(dataAndroid->toCpp()) : std::nullopt,
        developerPayloadAndroid != nullptr ? std::make_optional(developerPayloadAndroid->toCpp()) : std::nullopt,
        id->toStdString(),
        ids != nullptr ? std::make_optional(ids->toCpp()) : std::nullopt,
        isAcknowledgedAndroid != nullptr ? std::make_optional(isAcknowledgedAndroid->toCpp()) : std::nullopt,
        static_cast<bool>(isAutoRenewing),
        isSuspendedAndroid != nullptr ? std::make_optional(isSuspendedAndroid->toCpp()) : std::nullopt,
        obfuscatedAccountIdAndroid != nullptr ? std::make_optional(obfuscatedAccountIdAndroid->toCpp()) : std::nullopt,
        obfuscatedProfileIdAndroid != nullptr ? std::make_optional(obfuscatedProfileIdAndroid->toCpp()) : std::nullopt,
        packageNameAndroid != nullptr ? std::make_optional(packageNameAndroid->toCpp()) : std::nullopt,
        pendingPurchaseUpdateAndroid != nullptr ? std::make_optional(pendingPurchaseUpdateAndroid->toCpp()) : std::nullopt,
        platform->toCpp(),
        productId->toStdString(),
        purchaseState->toCpp(),
        purchaseToken != nullptr ? std::make_optional(purchaseToken->toCpp()) : std::nullopt,
        quantity,
        signatureAndroid != nullptr ? std::make_optional(signatureAndroid->toCpp()) : std::nullopt,
        store->toCpp(),
        transactionDate,
        transactionId != nullptr ? std::make_optional(transactionId->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<JPurchaseAndroid::javaobject> fromCpp(const PurchaseAndroid& value) {
      using JSignature = JPurchaseAndroid(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<jni::JString>, jni::alias_ref<JVariant_NullType_Array_String_>, jni::alias_ref<JVariant_NullType_Boolean>, jboolean, 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_PendingPurchaseUpdateAndroid>, 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_String>, jni::alias_ref<JIapStore>, double, jni::alias_ref<JVariant_NullType_String>);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        value.autoRenewingAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.autoRenewingAndroid.value()) : nullptr,
        value.currentPlanId.has_value() ? JVariant_NullType_String::fromCpp(value.currentPlanId.value()) : nullptr,
        value.dataAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.dataAndroid.value()) : nullptr,
        value.developerPayloadAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.developerPayloadAndroid.value()) : nullptr,
        jni::make_jstring(value.id),
        value.ids.has_value() ? JVariant_NullType_Array_String_::fromCpp(value.ids.value()) : nullptr,
        value.isAcknowledgedAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isAcknowledgedAndroid.value()) : nullptr,
        value.isAutoRenewing,
        value.isSuspendedAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.isSuspendedAndroid.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.packageNameAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.packageNameAndroid.value()) : nullptr,
        value.pendingPurchaseUpdateAndroid.has_value() ? JVariant_NullType_PendingPurchaseUpdateAndroid::fromCpp(value.pendingPurchaseUpdateAndroid.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.signatureAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.signatureAndroid.value()) : nullptr,
        JIapStore::fromCpp(value.store),
        value.transactionDate,
        value.transactionId.has_value() ? JVariant_NullType_String::fromCpp(value.transactionId.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::iap
