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

#include "JHybridNetDriverSpec.hpp"

// Forward declaration of `HybridNetSocketDriverSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridNetSocketDriverSpec; }
// Forward declaration of `HybridNetServerDriverSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridNetServerDriverSpec; }
// Forward declaration of `HybridHttpParserSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridHttpParserSpec; }
// Forward declaration of `NetConfig` to properly resolve imports.
namespace margelo::nitro::net { struct NetConfig; }

#include <memory>
#include "HybridNetSocketDriverSpec.hpp"
#include "JHybridNetSocketDriverSpec.hpp"
#include "HybridNetServerDriverSpec.hpp"
#include "JHybridNetServerDriverSpec.hpp"
#include "HybridHttpParserSpec.hpp"
#include "JHybridHttpParserSpec.hpp"
#include <NitroModules/ArrayBuffer.hpp>
#include <optional>
#include <NitroModules/JArrayBuffer.hpp>
#include <string>
#include "NetConfig.hpp"
#include "JNetConfig.hpp"

namespace margelo::nitro::net {

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

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

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

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

  // Properties
  

  // Methods
  std::shared_ptr<HybridNetSocketDriverSpec> JHybridNetDriverSpec::createSocket(const std::optional<std::string>& id) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridNetSocketDriverSpec::JavaPart>(jni::alias_ref<jni::JString> /* id */)>("createSocket");
    auto __result = method(_javaPart, id.has_value() ? jni::make_jstring(id.value()) : nullptr);
    return __result->getJHybridNetSocketDriverSpec();
  }
  std::shared_ptr<HybridNetServerDriverSpec> JHybridNetDriverSpec::createServer() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridNetServerDriverSpec::JavaPart>()>("createServer");
    auto __result = method(_javaPart);
    return __result->getJHybridNetServerDriverSpec();
  }
  std::shared_ptr<HybridHttpParserSpec> JHybridNetDriverSpec::createHttpParser(double mode) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridHttpParserSpec::JavaPart>(double /* mode */)>("createHttpParser");
    auto __result = method(_javaPart, mode);
    return __result->getJHybridHttpParserSpec();
  }
  double JHybridNetDriverSpec::createSecureContext(const std::string& cert, const std::string& key, const std::optional<std::string>& passphrase) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<double(jni::alias_ref<jni::JString> /* cert */, jni::alias_ref<jni::JString> /* key */, jni::alias_ref<jni::JString> /* passphrase */)>("createSecureContext");
    auto __result = method(_javaPart, jni::make_jstring(cert), jni::make_jstring(key), passphrase.has_value() ? jni::make_jstring(passphrase.value()) : nullptr);
    return __result;
  }
  double JHybridNetDriverSpec::createEmptySecureContext() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<double()>("createEmptySecureContext");
    auto __result = method(_javaPart);
    return __result;
  }
  void JHybridNetDriverSpec::addCACertToSecureContext(double scId, const std::string& ca) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* scId */, jni::alias_ref<jni::JString> /* ca */)>("addCACertToSecureContext");
    method(_javaPart, scId, jni::make_jstring(ca));
  }
  void JHybridNetDriverSpec::addContextToSecureContext(double scId, const std::string& hostname, const std::string& cert, const std::string& key, const std::optional<std::string>& passphrase) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* scId */, jni::alias_ref<jni::JString> /* hostname */, jni::alias_ref<jni::JString> /* cert */, jni::alias_ref<jni::JString> /* key */, jni::alias_ref<jni::JString> /* passphrase */)>("addContextToSecureContext");
    method(_javaPart, scId, jni::make_jstring(hostname), jni::make_jstring(cert), jni::make_jstring(key), passphrase.has_value() ? jni::make_jstring(passphrase.value()) : nullptr);
  }
  void JHybridNetDriverSpec::setPFXToSecureContext(double scId, const std::shared_ptr<ArrayBuffer>& pfx, const std::optional<std::string>& passphrase) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* scId */, jni::alias_ref<JArrayBuffer::javaobject> /* pfx */, jni::alias_ref<jni::JString> /* passphrase */)>("setPFXToSecureContext");
    method(_javaPart, scId, JArrayBuffer::wrap(pfx), passphrase.has_value() ? jni::make_jstring(passphrase.value()) : nullptr);
  }
  void JHybridNetDriverSpec::setOCSPResponseToSecureContext(double scId, const std::shared_ptr<ArrayBuffer>& ocsp) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* scId */, jni::alias_ref<JArrayBuffer::javaobject> /* ocsp */)>("setOCSPResponseToSecureContext");
    method(_javaPart, scId, JArrayBuffer::wrap(ocsp));
  }
  std::optional<std::shared_ptr<ArrayBuffer>> JHybridNetDriverSpec::getTicketKeys(double scId) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JArrayBuffer::javaobject>(double /* scId */)>("getTicketKeys");
    auto __result = method(_javaPart, scId);
    return __result != nullptr ? std::make_optional(__result->cthis()->getArrayBuffer()) : std::nullopt;
  }
  void JHybridNetDriverSpec::setTicketKeys(double scId, const std::shared_ptr<ArrayBuffer>& keys) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* scId */, jni::alias_ref<JArrayBuffer::javaobject> /* keys */)>("setTicketKeys");
    method(_javaPart, scId, JArrayBuffer::wrap(keys));
  }
  void JHybridNetDriverSpec::initWithConfig(const NetConfig& config) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JNetConfig> /* config */)>("initWithConfig");
    method(_javaPart, JNetConfig::fromCpp(config));
  }

} // namespace margelo::nitro::net
