///
/// JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.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 <variant>

#include "NitroReceiptValidationResultIOS.hpp"
#include "NitroReceiptValidationResultAndroid.hpp"
#include <variant>
#include "JNitroReceiptValidationResultIOS.hpp"
#include <string>
#include <NitroModules/Null.hpp>
#include "NitroPurchase.hpp"
#include <optional>
#include "JVariant_NullType_NitroPurchase.hpp"
#include <NitroModules/JNull.hpp>
#include "JNitroPurchase.hpp"
#include "JVariant_NullType_String.hpp"
#include "IapPlatform.hpp"
#include "JIapPlatform.hpp"
#include "IapStore.hpp"
#include "JIapStore.hpp"
#include "PurchaseState.hpp"
#include "JPurchaseState.hpp"
#include "JVariant_NullType_Double.hpp"
#include "JVariant_NullType_Boolean.hpp"
#include "NitroRenewalInfoIOS.hpp"
#include "JVariant_NullType_NitroRenewalInfoIOS.hpp"
#include "JNitroRenewalInfoIOS.hpp"
#include "JNitroReceiptValidationResultAndroid.hpp"

namespace margelo::nitro::iap {

  using namespace facebook;

  /**
   * The C++ JNI bridge between the C++ std::variant and the Java class "Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid".
   */
  class JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid: public jni::JavaClass<JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid;";

    static jni::local_ref<JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid> create_0(jni::alias_ref<JNitroReceiptValidationResultIOS> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid(jni::alias_ref<JNitroReceiptValidationResultIOS>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid> create_1(jni::alias_ref<JNitroReceiptValidationResultAndroid> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid(jni::alias_ref<JNitroReceiptValidationResultAndroid>)>("create");
      return method(javaClassStatic(), value);
    }

    static jni::local_ref<JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid> fromCpp(const std::variant<NitroReceiptValidationResultIOS, NitroReceiptValidationResultAndroid>& variant) {
      switch (variant.index()) {
        case 0: return create_0(JNitroReceiptValidationResultIOS::fromCpp(std::get<0>(variant)));
        case 1: return create_1(JNitroReceiptValidationResultAndroid::fromCpp(std::get<1>(variant)));
        default: throw std::invalid_argument("Variant holds unknown index! (" + std::to_string(variant.index()) + ")");
      }
    }

    [[nodiscard]] std::variant<NitroReceiptValidationResultIOS, NitroReceiptValidationResultAndroid> toCpp() const;
  };

  namespace JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid_impl {
    class First final: public jni::JavaClass<First, JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid> {
    public:
      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid$First;";
    
      [[nodiscard]] jni::local_ref<JNitroReceiptValidationResultIOS> getValue() const {
        static const auto field = javaClassStatic()->getField<JNitroReceiptValidationResultIOS>("value");
        return getFieldValue(field);
      }
    };
    
    class Second final: public jni::JavaClass<Second, JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid> {
    public:
      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid$Second;";
    
      [[nodiscard]] jni::local_ref<JNitroReceiptValidationResultAndroid> getValue() const {
        static const auto field = javaClassStatic()->getField<JNitroReceiptValidationResultAndroid>("value");
        return getFieldValue(field);
      }
    };
  } // namespace JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid_impl
} // namespace margelo::nitro::iap
