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

  public:
    /**
     * Convert this Java/Kotlin-based struct to the C++ struct NitroReceiptValidationResultAndroid by copying all values to C++.
     */
    [[maybe_unused]]
    [[nodiscard]]
    NitroReceiptValidationResultAndroid toCpp() const {
      static const auto clazz = javaClassStatic();
      static const auto fieldAutoRenewing = clazz->getField<jboolean>("autoRenewing");
      jboolean autoRenewing = this->getFieldValue(fieldAutoRenewing);
      static const auto fieldBetaProduct = clazz->getField<jboolean>("betaProduct");
      jboolean betaProduct = this->getFieldValue(fieldBetaProduct);
      static const auto fieldCancelDate = clazz->getField<JVariant_NullType_Double>("cancelDate");
      jni::local_ref<JVariant_NullType_Double> cancelDate = this->getFieldValue(fieldCancelDate);
      static const auto fieldCancelReason = clazz->getField<JVariant_NullType_String>("cancelReason");
      jni::local_ref<JVariant_NullType_String> cancelReason = this->getFieldValue(fieldCancelReason);
      static const auto fieldDeferredDate = clazz->getField<JVariant_NullType_Double>("deferredDate");
      jni::local_ref<JVariant_NullType_Double> deferredDate = this->getFieldValue(fieldDeferredDate);
      static const auto fieldDeferredSku = clazz->getField<JVariant_NullType_String>("deferredSku");
      jni::local_ref<JVariant_NullType_String> deferredSku = this->getFieldValue(fieldDeferredSku);
      static const auto fieldFreeTrialEndDate = clazz->getField<double>("freeTrialEndDate");
      double freeTrialEndDate = this->getFieldValue(fieldFreeTrialEndDate);
      static const auto fieldGracePeriodEndDate = clazz->getField<double>("gracePeriodEndDate");
      double gracePeriodEndDate = this->getFieldValue(fieldGracePeriodEndDate);
      static const auto fieldParentProductId = clazz->getField<jni::JString>("parentProductId");
      jni::local_ref<jni::JString> parentProductId = this->getFieldValue(fieldParentProductId);
      static const auto fieldProductId = clazz->getField<jni::JString>("productId");
      jni::local_ref<jni::JString> productId = this->getFieldValue(fieldProductId);
      static const auto fieldProductType = clazz->getField<jni::JString>("productType");
      jni::local_ref<jni::JString> productType = this->getFieldValue(fieldProductType);
      static const auto fieldPurchaseDate = clazz->getField<double>("purchaseDate");
      double purchaseDate = this->getFieldValue(fieldPurchaseDate);
      static const auto fieldQuantity = clazz->getField<double>("quantity");
      double quantity = this->getFieldValue(fieldQuantity);
      static const auto fieldReceiptId = clazz->getField<jni::JString>("receiptId");
      jni::local_ref<jni::JString> receiptId = this->getFieldValue(fieldReceiptId);
      static const auto fieldRenewalDate = clazz->getField<double>("renewalDate");
      double renewalDate = this->getFieldValue(fieldRenewalDate);
      static const auto fieldTerm = clazz->getField<jni::JString>("term");
      jni::local_ref<jni::JString> term = this->getFieldValue(fieldTerm);
      static const auto fieldTermSku = clazz->getField<jni::JString>("termSku");
      jni::local_ref<jni::JString> termSku = this->getFieldValue(fieldTermSku);
      static const auto fieldTestTransaction = clazz->getField<jboolean>("testTransaction");
      jboolean testTransaction = this->getFieldValue(fieldTestTransaction);
      return NitroReceiptValidationResultAndroid(
        static_cast<bool>(autoRenewing),
        static_cast<bool>(betaProduct),
        cancelDate != nullptr ? std::make_optional(cancelDate->toCpp()) : std::nullopt,
        cancelReason != nullptr ? std::make_optional(cancelReason->toCpp()) : std::nullopt,
        deferredDate != nullptr ? std::make_optional(deferredDate->toCpp()) : std::nullopt,
        deferredSku != nullptr ? std::make_optional(deferredSku->toCpp()) : std::nullopt,
        freeTrialEndDate,
        gracePeriodEndDate,
        parentProductId->toStdString(),
        productId->toStdString(),
        productType->toStdString(),
        purchaseDate,
        quantity,
        receiptId->toStdString(),
        renewalDate,
        term->toStdString(),
        termSku->toStdString(),
        static_cast<bool>(testTransaction)
      );
    }

  public:
    /**
     * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
     */
    [[maybe_unused]]
    static jni::local_ref<JNitroReceiptValidationResultAndroid::javaobject> fromCpp(const NitroReceiptValidationResultAndroid& value) {
      using JSignature = JNitroReceiptValidationResultAndroid(jboolean, jboolean, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, jni::alias_ref<JVariant_NullType_Double>, jni::alias_ref<JVariant_NullType_String>, double, double, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, double, double, jni::alias_ref<jni::JString>, double, jni::alias_ref<jni::JString>, jni::alias_ref<jni::JString>, jboolean);
      static const auto clazz = javaClassStatic();
      static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
      return create(
        clazz,
        value.autoRenewing,
        value.betaProduct,
        value.cancelDate.has_value() ? JVariant_NullType_Double::fromCpp(value.cancelDate.value()) : nullptr,
        value.cancelReason.has_value() ? JVariant_NullType_String::fromCpp(value.cancelReason.value()) : nullptr,
        value.deferredDate.has_value() ? JVariant_NullType_Double::fromCpp(value.deferredDate.value()) : nullptr,
        value.deferredSku.has_value() ? JVariant_NullType_String::fromCpp(value.deferredSku.value()) : nullptr,
        value.freeTrialEndDate,
        value.gracePeriodEndDate,
        jni::make_jstring(value.parentProductId),
        jni::make_jstring(value.productId),
        jni::make_jstring(value.productType),
        value.purchaseDate,
        value.quantity,
        jni::make_jstring(value.receiptId),
        value.renewalDate,
        jni::make_jstring(value.term),
        jni::make_jstring(value.termSku),
        value.testTransaction
      );
    }
  };

} // namespace margelo::nitro::iap
