///
/// JFunc_void_NitroProduct.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 <functional>

#include "NitroProduct.hpp"
#include <functional>
#include <NitroModules/JNICallable.hpp>
#include "JNitroProduct.hpp"
#include <string>
#include <NitroModules/Null.hpp>
#include <variant>
#include <optional>
#include "JVariant_NullType_String.hpp"
#include <NitroModules/JNull.hpp>
#include "JVariant_NullType_Double.hpp"
#include "IapPlatform.hpp"
#include "JIapPlatform.hpp"
#include "JVariant_NullType_Boolean.hpp"
#include "PaymentModeIOS.hpp"
#include "JPaymentModeIOS.hpp"
#include "NitroOneTimePurchaseOfferDetail.hpp"
#include <vector>
#include "JVariant_NullType_Array_NitroOneTimePurchaseOfferDetail_.hpp"
#include "JNitroOneTimePurchaseOfferDetail.hpp"
#include "NitroDiscountDisplayInfoAndroid.hpp"
#include "JVariant_NullType_NitroDiscountDisplayInfoAndroid.hpp"
#include "JNitroDiscountDisplayInfoAndroid.hpp"
#include "NitroDiscountAmountAndroid.hpp"
#include "JVariant_NullType_NitroDiscountAmountAndroid.hpp"
#include "JNitroDiscountAmountAndroid.hpp"
#include "NitroLimitedQuantityInfoAndroid.hpp"
#include "JVariant_NullType_NitroLimitedQuantityInfoAndroid.hpp"
#include "JNitroLimitedQuantityInfoAndroid.hpp"
#include "NitroPreorderDetailsAndroid.hpp"
#include "JVariant_NullType_NitroPreorderDetailsAndroid.hpp"
#include "JNitroPreorderDetailsAndroid.hpp"
#include "NitroRentalDetailsAndroid.hpp"
#include "JVariant_NullType_NitroRentalDetailsAndroid.hpp"
#include "JNitroRentalDetailsAndroid.hpp"
#include "NitroValidTimeWindowAndroid.hpp"
#include "JVariant_NullType_NitroValidTimeWindowAndroid.hpp"
#include "JNitroValidTimeWindowAndroid.hpp"

namespace margelo::nitro::iap {

  using namespace facebook;

  /**
   * Represents the Java/Kotlin callback `(product: NitroProduct) -> Unit`.
   * This can be passed around between C++ and Java/Kotlin.
   */
  struct JFunc_void_NitroProduct: public jni::JavaClass<JFunc_void_NitroProduct> {
  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/Func_void_NitroProduct;";

  public:
    /**
     * Invokes the function this `JFunc_void_NitroProduct` instance holds through JNI.
     */
    void invoke(const NitroProduct& product) const {
      static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<JNitroProduct> /* product */)>("invoke");
      method(self(), JNitroProduct::fromCpp(product));
    }
  };

  /**
   * An implementation of Func_void_NitroProduct that is backed by a C++ implementation (using `std::function<...>`)
   */
  class JFunc_void_NitroProduct_cxx final: public jni::HybridClass<JFunc_void_NitroProduct_cxx, JFunc_void_NitroProduct> {
  public:
    static jni::local_ref<JFunc_void_NitroProduct::javaobject> fromCpp(const std::function<void(const NitroProduct& /* product */)>& func) {
      return JFunc_void_NitroProduct_cxx::newObjectCxxArgs(func);
    }

  public:
    /**
     * Invokes the C++ `std::function<...>` this `JFunc_void_NitroProduct_cxx` instance holds.
     */
    void invoke_cxx(jni::alias_ref<JNitroProduct> product) {
      _func(product->toCpp());
    }

  public:
    [[nodiscard]]
    inline const std::function<void(const NitroProduct& /* product */)>& getFunction() const {
      return _func;
    }

  public:
    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/iap/Func_void_NitroProduct_cxx;";
    static void registerNatives() {
      registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_NitroProduct_cxx::invoke_cxx)});
    }

  private:
    explicit JFunc_void_NitroProduct_cxx(const std::function<void(const NitroProduct& /* product */)>& func): _func(func) { }

  private:
    friend HybridBase;
    std::function<void(const NitroProduct& /* product */)> _func;
  };

} // namespace margelo::nitro::iap
