///
/// JHybridTaponPagseguroSpec.cpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#include "JHybridTaponPagseguroSpec.hpp"

// Forward declaration of `CustomError` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { struct CustomError; }
// Forward declaration of `ErrorCode` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { enum class ErrorCode; }
// Forward declaration of `PaymentResult` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { struct PaymentResult; }
// Forward declaration of `PaymentTypes` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { enum class PaymentTypes; }
// Forward declaration of `InstallmentTypes` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { enum class InstallmentTypes; }
// Forward declaration of `SettingData` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { struct SettingData; }
// Forward declaration of `ThemeSettings` to properly resolve imports.
namespace margelo::nitro::taponpagseguro { struct ThemeSettings; }

#include "CustomError.hpp"
#include <optional>
#include "JCustomError.hpp"
#include "ErrorCode.hpp"
#include "JErrorCode.hpp"
#include <string>
#include <variant>
#include <NitroModules/Promise.hpp>
#include <NitroModules/JPromise.hpp>
#include "JVariant_Boolean_CustomError.hpp"
#include "PaymentResult.hpp"
#include "JVariant_CustomError_PaymentResult.hpp"
#include "JPaymentResult.hpp"
#include "PaymentTypes.hpp"
#include "JPaymentTypes.hpp"
#include "InstallmentTypes.hpp"
#include "JInstallmentTypes.hpp"
#include "SettingData.hpp"
#include "JSettingData.hpp"
#include "ThemeSettings.hpp"
#include "JThemeSettings.hpp"

namespace margelo::nitro::taponpagseguro {

  std::shared_ptr<JHybridTaponPagseguroSpec> JHybridTaponPagseguroSpec::JavaPart::getJHybridTaponPagseguroSpec() {
    auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
    auto castHybridObject = std::dynamic_pointer_cast<JHybridTaponPagseguroSpec>(hybridObject);
    if (castHybridObject == nullptr) [[unlikely]] {
      throw std::runtime_error("Failed to downcast JHybridObject to JHybridTaponPagseguroSpec!");
    }
    return castHybridObject;
  }

  jni::local_ref<JHybridTaponPagseguroSpec::CxxPart::jhybriddata> JHybridTaponPagseguroSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
    return makeCxxInstance(jThis);
  }

  std::shared_ptr<JHybridObject> JHybridTaponPagseguroSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
    auto castJavaPart = jni::dynamic_ref_cast<JHybridTaponPagseguroSpec::JavaPart>(javaPart);
    if (castJavaPart == nullptr) [[unlikely]] {
      throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridTaponPagseguroSpec::JavaPart!");
    }
    return std::make_shared<JHybridTaponPagseguroSpec>(castJavaPart);
  }

  void JHybridTaponPagseguroSpec::CxxPart::registerNatives() {
    registerHybrid({
      makeNativeMethod("initHybrid", JHybridTaponPagseguroSpec::CxxPart::initHybrid),
    });
  }

  // Properties
  

  // Methods
  void JHybridTaponPagseguroSpec::initialize(const SettingData& data) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JSettingData> /* data */)>("initialize");
    method(_javaPart, JSettingData::fromCpp(data));
  }
  std::optional<CustomError> JHybridTaponPagseguroSpec::setTheme(const ThemeSettings& data) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JCustomError>(jni::alias_ref<JThemeSettings> /* data */)>("setTheme");
    auto __result = method(_javaPart, JThemeSettings::fromCpp(data));
    return __result != nullptr ? std::make_optional(__result->toCpp()) : std::nullopt;
  }
  bool JHybridTaponPagseguroSpec::isPackageAvailable() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isPackageAvailable");
    auto __result = method(_javaPart);
    return static_cast<bool>(__result);
  }
  bool JHybridTaponPagseguroSpec::isNfcEnabled() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isNfcEnabled");
    auto __result = method(_javaPart);
    return static_cast<bool>(__result);
  }
  bool JHybridTaponPagseguroSpec::isNfcSupported() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isNfcSupported");
    auto __result = method(_javaPart);
    return static_cast<bool>(__result);
  }
  bool JHybridTaponPagseguroSpec::isExtensionSupported() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isExtensionSupported");
    auto __result = method(_javaPart);
    return static_cast<bool>(__result);
  }
  void JHybridTaponPagseguroSpec::openPackageOnPlaystore() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("openPackageOnPlaystore");
    method(_javaPart);
  }
  std::shared_ptr<Promise<std::variant<bool, CustomError>>> JHybridTaponPagseguroSpec::requestLogin() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("requestLogin");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<std::variant<bool, CustomError>>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JVariant_Boolean_CustomError>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<std::variant<bool, CustomError>>> JHybridTaponPagseguroSpec::requestLogout() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("requestLogout");
    auto __result = method(_javaPart);
    return [&]() {
      auto __promise = Promise<std::variant<bool, CustomError>>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JVariant_Boolean_CustomError>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<std::variant<CustomError, PaymentResult>>> JHybridTaponPagseguroSpec::requestPayment(double amount) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(double /* amount */)>("requestPayment");
    auto __result = method(_javaPart, amount);
    return [&]() {
      auto __promise = Promise<std::variant<CustomError, PaymentResult>>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JVariant_CustomError_PaymentResult>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  std::shared_ptr<Promise<std::variant<bool, CustomError>>> JHybridTaponPagseguroSpec::requestRefund(const std::string& transaction_code, double amount) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* transaction_code */, double /* amount */)>("requestRefund");
    auto __result = method(_javaPart, jni::make_jstring(transaction_code), amount);
    return [&]() {
      auto __promise = Promise<std::variant<bool, CustomError>>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JVariant_Boolean_CustomError>(__boxedResult);
        __promise->resolve(__result->toCpp());
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }

} // namespace margelo::nitro::taponpagseguro
