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

#include "JHybridUrlRequestBuilderSpec.hpp"

// Forward declaration of `HybridUrlRequestSpec` to properly resolve imports.
namespace margelo::nitro::nitrofetch { class HybridUrlRequestSpec; }
// Forward declaration of `UrlResponseInfo` to properly resolve imports.
namespace margelo::nitro::nitrofetch { struct UrlResponseInfo; }
// Forward declaration of `HttpHeader` to properly resolve imports.
namespace margelo::nitro::nitrofetch { struct HttpHeader; }
// Forward declaration of `RequestException` to properly resolve imports.
namespace margelo::nitro::nitrofetch { struct RequestException; }

#include <memory>
#include "HybridUrlRequestSpec.hpp"
#include "JHybridUrlRequestSpec.hpp"
#include <string>
#include <NitroModules/ArrayBuffer.hpp>
#include <variant>
#include "JVariant_ArrayBuffer_String.hpp"
#include <NitroModules/JArrayBuffer.hpp>
#include "UrlResponseInfo.hpp"
#include <functional>
#include "JFunc_void_UrlResponseInfo.hpp"
#include <NitroModules/JNICallable.hpp>
#include "JUrlResponseInfo.hpp"
#include <unordered_map>
#include "HttpHeader.hpp"
#include <vector>
#include "JHttpHeader.hpp"
#include <optional>
#include "RequestException.hpp"
#include "JFunc_void_std__optional_UrlResponseInfo__RequestException.hpp"
#include "JRequestException.hpp"
#include "JFunc_void_std__optional_UrlResponseInfo_.hpp"
#include "JFunc_void_UrlResponseInfo_std__string.hpp"
#include "JFunc_void_UrlResponseInfo_std__shared_ptr_ArrayBuffer__double.hpp"

namespace margelo::nitro::nitrofetch {

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

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

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

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

  // Properties
  

  // Methods
  void JHybridUrlRequestBuilderSpec::setHttpMethod(const std::string& httpMethod) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* httpMethod */)>("setHttpMethod");
    method(_javaPart, jni::make_jstring(httpMethod));
  }
  void JHybridUrlRequestBuilderSpec::addHeader(const std::string& name, const std::string& value) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* name */, jni::alias_ref<jni::JString> /* value */)>("addHeader");
    method(_javaPart, jni::make_jstring(name), jni::make_jstring(value));
  }
  void JHybridUrlRequestBuilderSpec::setUploadBody(const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& body) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JVariant_ArrayBuffer_String> /* body */)>("setUploadBody");
    method(_javaPart, JVariant_ArrayBuffer_String::fromCpp(body));
  }
  void JHybridUrlRequestBuilderSpec::disableCache() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("disableCache");
    method(_javaPart);
  }
  void JHybridUrlRequestBuilderSpec::onSucceeded(const std::function<void(const UrlResponseInfo& /* info */)>& callback) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_UrlResponseInfo::javaobject> /* callback */)>("onSucceeded_cxx");
    method(_javaPart, JFunc_void_UrlResponseInfo_cxx::fromCpp(callback));
  }
  void JHybridUrlRequestBuilderSpec::onFailed(const std::function<void(const std::optional<UrlResponseInfo>& /* info */, const RequestException& /* error */)>& callback) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_std__optional_UrlResponseInfo__RequestException::javaobject> /* callback */)>("onFailed_cxx");
    method(_javaPart, JFunc_void_std__optional_UrlResponseInfo__RequestException_cxx::fromCpp(callback));
  }
  void JHybridUrlRequestBuilderSpec::onCanceled(const std::function<void(const std::optional<UrlResponseInfo>& /* info */)>& callback) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_std__optional_UrlResponseInfo_::javaobject> /* callback */)>("onCanceled_cxx");
    method(_javaPart, JFunc_void_std__optional_UrlResponseInfo__cxx::fromCpp(callback));
  }
  void JHybridUrlRequestBuilderSpec::onRedirectReceived(const std::function<void(const UrlResponseInfo& /* info */, const std::string& /* newLocationUrl */)>& callback) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_UrlResponseInfo_std__string::javaobject> /* callback */)>("onRedirectReceived_cxx");
    method(_javaPart, JFunc_void_UrlResponseInfo_std__string_cxx::fromCpp(callback));
  }
  void JHybridUrlRequestBuilderSpec::onResponseStarted(const std::function<void(const UrlResponseInfo& /* info */)>& callback) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_UrlResponseInfo::javaobject> /* callback */)>("onResponseStarted_cxx");
    method(_javaPart, JFunc_void_UrlResponseInfo_cxx::fromCpp(callback));
  }
  void JHybridUrlRequestBuilderSpec::onReadCompleted(const std::function<void(const UrlResponseInfo& /* info */, const std::shared_ptr<ArrayBuffer>& /* byteBuffer */, double /* bytesRead */)>& callback) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_void_UrlResponseInfo_std__shared_ptr_ArrayBuffer__double::javaobject> /* callback */)>("onReadCompleted_cxx");
    method(_javaPart, JFunc_void_UrlResponseInfo_std__shared_ptr_ArrayBuffer__double_cxx::fromCpp(callback));
  }
  std::shared_ptr<HybridUrlRequestSpec> JHybridUrlRequestBuilderSpec::build() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridUrlRequestSpec::JavaPart>()>("build");
    auto __result = method(_javaPart);
    return __result->getJHybridUrlRequestSpec();
  }

} // namespace margelo::nitro::nitrofetch
