///
/// JNitroActiveSubscription.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 "NitroActiveSubscription.hpp"

#include "JNitroRenewalInfoIOS.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 <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 "NitroActiveSubscription" and the the Kotlin data class "NitroActiveSubscription".
   */
  struct JNitroActiveSubscription final: public jni::JavaClass<JNitroActiveSubscription> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/NitroActiveSubscription;";

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct NitroActiveSubscription by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    NitroActiveSubscription toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldProductId = clazz->getField<jni::JString>("productId");
      jni::local_ref<jni::JString> productId = this->getFieldValue(fieldProductId);
      static const auto fieldIsActive = clazz->getField<jboolean>("isActive");
      jboolean isActive = this->getFieldValue(fieldIsActive);
      static const auto fieldTransactionId = clazz->getField<jni::JString>("transactionId");
      jni::local_ref<jni::JString> transactionId = this->getFieldValue(fieldTransactionId);
      static const auto fieldPurchaseToken = clazz->getField<JVariant_NullType_String>("purchaseToken");
      jni::local_ref<JVariant_NullType_String> purchaseToken = this->getFieldValue(fieldPurchaseToken);
      static const auto fieldTransactionDate = clazz->getField<double>("transactionDate");
      double transactionDate = this->getFieldValue(fieldTransactionDate);
      static const auto fieldExpirationDateIOS = clazz->getField<JVariant_NullType_Double>("expirationDateIOS");
      jni::local_ref<JVariant_NullType_Double> expirationDateIOS = this->getFieldValue(fieldExpirationDateIOS);
      static const auto fieldEnvironmentIOS = clazz->getField<JVariant_NullType_String>("environmentIOS");
      jni::local_ref<JVariant_NullType_String> environmentIOS = this->getFieldValue(fieldEnvironmentIOS);
      static const auto fieldWillExpireSoon = clazz->getField<JVariant_NullType_Boolean>("willExpireSoon");
      jni::local_ref<JVariant_NullType_Boolean> willExpireSoon = this->getFieldValue(fieldWillExpireSoon);
      static const auto fieldDaysUntilExpirationIOS = clazz->getField<JVariant_NullType_Double>("daysUntilExpirationIOS");
      jni::local_ref<JVariant_NullType_Double> daysUntilExpirationIOS = this->getFieldValue(fieldDaysUntilExpirationIOS);
      static const auto fieldRenewalInfoIOS = clazz->getField<JVariant_NullType_NitroRenewalInfoIOS>("renewalInfoIOS");
      jni::local_ref<JVariant_NullType_NitroRenewalInfoIOS> renewalInfoIOS = this->getFieldValue(fieldRenewalInfoIOS);
      static const auto fieldAutoRenewingAndroid = clazz->getField<JVariant_NullType_Boolean>("autoRenewingAndroid");
      jni::local_ref<JVariant_NullType_Boolean> autoRenewingAndroid = this->getFieldValue(fieldAutoRenewingAndroid);
      static const auto fieldBasePlanIdAndroid = clazz->getField<JVariant_NullType_String>("basePlanIdAndroid");
      jni::local_ref<JVariant_NullType_String> basePlanIdAndroid = this->getFieldValue(fieldBasePlanIdAndroid);
      static const auto fieldCurrentPlanId = clazz->getField<JVariant_NullType_String>("currentPlanId");
      jni::local_ref<JVariant_NullType_String> currentPlanId = this->getFieldValue(fieldCurrentPlanId);
      static const auto fieldPurchaseTokenAndroid = clazz->getField<JVariant_NullType_String>("purchaseTokenAndroid");
      jni::local_ref<JVariant_NullType_String> purchaseTokenAndroid = this->getFieldValue(fieldPurchaseTokenAndroid);
      return NitroActiveSubscription(
        productId->toStdString(),
        static_cast<bool>(isActive),
        transactionId->toStdString(),
        purchaseToken != nullptr ? std::make_optional(purchaseToken->toCpp()) : std::nullopt,
        transactionDate,
        expirationDateIOS != nullptr ? std::make_optional(expirationDateIOS->toCpp()) : std::nullopt,
        environmentIOS != nullptr ? std::make_optional(environmentIOS->toCpp()) : std::nullopt,
        willExpireSoon != nullptr ? std::make_optional(willExpireSoon->toCpp()) : std::nullopt,
        daysUntilExpirationIOS != nullptr ? std::make_optional(daysUntilExpirationIOS->toCpp()) : std::nullopt,
        renewalInfoIOS != nullptr ? std::make_optional(renewalInfoIOS->toCpp()) : std::nullopt,
        autoRenewingAndroid != nullptr ? std::make_optional(autoRenewingAndroid->toCpp()) : std::nullopt,
        basePlanIdAndroid != nullptr ? std::make_optional(basePlanIdAndroid->toCpp()) : std::nullopt,
        currentPlanId != nullptr ? std::make_optional(currentPlanId->toCpp()) : std::nullopt,
        purchaseTokenAndroid != nullptr ? std::make_optional(purchaseTokenAndroid->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<JNitroActiveSubscription::javaobject> fromCpp(const NitroActiveSubscription& value) {
      using JSignature = JNitroActiveSubscription(jni::alias_ref<jni::JString>, jboolean, jni::alias_ref<jni::JString>, jni::alias_ref<JVariant_NullType_String>, double, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_Boolean>, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_NitroRenewalInfoIOS>, jni::alias_ref<JVariant_NullType_Boolean>, jni::alias_ref<JVariant_NullType_String>, 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,
        jni::make_jstring(value.productId),
        value.isActive,
        jni::make_jstring(value.transactionId),
        value.purchaseToken.has_value() ? JVariant_NullType_String::fromCpp(value.purchaseToken.value()) : nullptr,
        value.transactionDate,
        value.expirationDateIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.expirationDateIOS.value()) : nullptr,
        value.environmentIOS.has_value() ? JVariant_NullType_String::fromCpp(value.environmentIOS.value()) : nullptr,
        value.willExpireSoon.has_value() ? JVariant_NullType_Boolean::fromCpp(value.willExpireSoon.value()) : nullptr,
        value.daysUntilExpirationIOS.has_value() ? JVariant_NullType_Double::fromCpp(value.daysUntilExpirationIOS.value()) : nullptr,
        value.renewalInfoIOS.has_value() ? JVariant_NullType_NitroRenewalInfoIOS::fromCpp(value.renewalInfoIOS.value()) : nullptr,
        value.autoRenewingAndroid.has_value() ? JVariant_NullType_Boolean::fromCpp(value.autoRenewingAndroid.value()) : nullptr,
        value.basePlanIdAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.basePlanIdAndroid.value()) : nullptr,
        value.currentPlanId.has_value() ? JVariant_NullType_String::fromCpp(value.currentPlanId.value()) : nullptr,
        value.purchaseTokenAndroid.has_value() ? JVariant_NullType_String::fromCpp(value.purchaseTokenAndroid.value()) : nullptr
      );
    }
  };

} // namespace margelo::nitro::iap
