///
/// JRequestPurchaseResult.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 <NitroModules/Null.hpp>
#include "PurchaseAndroid.hpp"
#include "PurchaseIOS.hpp"
#include <variant>
#include <vector>
#include <NitroModules/JNull.hpp>
#include "JPurchaseAndroid.hpp"
#include <optional>
#include "JVariant_NullType_Boolean.hpp"
#include <string>
#include "JVariant_NullType_String.hpp"
#include "JVariant_NullType_Array_String_.hpp"
#include "PendingPurchaseUpdateAndroid.hpp"
#include "JVariant_NullType_PendingPurchaseUpdateAndroid.hpp"
#include "JPendingPurchaseUpdateAndroid.hpp"
#include "IapPlatform.hpp"
#include "JIapPlatform.hpp"
#include "PurchaseState.hpp"
#include "JPurchaseState.hpp"
#include "IapStore.hpp"
#include "JIapStore.hpp"
#include "JPurchaseIOS.hpp"
#include "JVariant_NullType_Double.hpp"
#include "PurchaseOfferIOS.hpp"
#include "JVariant_NullType_PurchaseOfferIOS.hpp"
#include "JPurchaseOfferIOS.hpp"
#include "RenewalInfoIOS.hpp"
#include "JVariant_NullType_RenewalInfoIOS.hpp"
#include "JRenewalInfoIOS.hpp"
#include "JPurchase.hpp"

namespace margelo::nitro::iap {

  using namespace facebook;

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

    static jni::local_ref<JRequestPurchaseResult> create_0(jni::alias_ref<JNull> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JRequestPurchaseResult(jni::alias_ref<JNull>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JRequestPurchaseResult> create_1(jni::alias_ref<JPurchaseAndroid> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JRequestPurchaseResult(jni::alias_ref<JPurchaseAndroid>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JRequestPurchaseResult> create_2(jni::alias_ref<JPurchaseIOS> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JRequestPurchaseResult(jni::alias_ref<JPurchaseIOS>)>("create");
      return method(javaClassStatic(), value);
    }
    static jni::local_ref<JRequestPurchaseResult> create_3(jni::alias_ref<jni::JArrayClass<JPurchase>> value) {
      static const auto method = javaClassStatic()->getStaticMethod<JRequestPurchaseResult(jni::alias_ref<jni::JArrayClass<JPurchase>>)>("create");
      return method(javaClassStatic(), value);
    }

    static jni::local_ref<JRequestPurchaseResult> fromCpp(const std::variant<nitro::NullType, PurchaseAndroid, PurchaseIOS, std::vector<std::variant<PurchaseAndroid, PurchaseIOS>>>& variant) {
      switch (variant.index()) {
        case 0: return create_0(JNull::null());
        case 1: return create_1(JPurchaseAndroid::fromCpp(std::get<1>(variant)));
        case 2: return create_2(JPurchaseIOS::fromCpp(std::get<2>(variant)));
        case 3: return create_3([&]() {
          size_t __size = std::get<3>(variant).size();
          jni::local_ref<jni::JArrayClass<JPurchase>> __array = jni::JArrayClass<JPurchase>::newArray(__size);
          for (size_t __i = 0; __i < __size; __i++) {
            const auto& __element = std::get<3>(variant)[__i];
            auto __elementJni = JPurchase::fromCpp(__element);
            __array->setElement(__i, *__elementJni);
          }
          return __array;
        }());
        default: throw std::invalid_argument("Variant holds unknown index! (" + std::to_string(variant.index()) + ")");
      }
    }

    [[nodiscard]] std::variant<nitro::NullType, PurchaseAndroid, PurchaseIOS, std::vector<std::variant<PurchaseAndroid, PurchaseIOS>>> toCpp() const;
  };

  namespace JRequestPurchaseResult_impl {
    class First final: public jni::JavaClass<First, JRequestPurchaseResult> {
    public:
      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/RequestPurchaseResult$First;";
    
      [[nodiscard]] jni::local_ref<JNull> getValue() const {
        static const auto field = javaClassStatic()->getField<JNull>("value");
        return getFieldValue(field);
      }
    };
    
    class Second final: public jni::JavaClass<Second, JRequestPurchaseResult> {
    public:
      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/RequestPurchaseResult$Second;";
    
      [[nodiscard]] jni::local_ref<JPurchaseAndroid> getValue() const {
        static const auto field = javaClassStatic()->getField<JPurchaseAndroid>("value");
        return getFieldValue(field);
      }
    };
    
    class Third final: public jni::JavaClass<Third, JRequestPurchaseResult> {
    public:
      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/RequestPurchaseResult$Third;";
    
      [[nodiscard]] jni::local_ref<JPurchaseIOS> getValue() const {
        static const auto field = javaClassStatic()->getField<JPurchaseIOS>("value");
        return getFieldValue(field);
      }
    };
    
    class Fourth final: public jni::JavaClass<Fourth, JRequestPurchaseResult> {
    public:
      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/RequestPurchaseResult$Fourth;";
    
      [[nodiscard]] jni::local_ref<jni::JArrayClass<JPurchase>> getValue() const {
        static const auto field = javaClassStatic()->getField<jni::JArrayClass<JPurchase>>("value");
        return getFieldValue(field);
      }
    };
  } // namespace JRequestPurchaseResult_impl
} // namespace margelo::nitro::iap
