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

#include "FastIOOnLoad.hpp"

#include <jni.h>
#include <fbjni/fbjni.h>
#include <NitroModules/HybridObjectRegistry.hpp>

#include "JHybridFileSystemSpec.hpp"
#include "JHybridNetworkSpec.hpp"
#include "JHybridInputStreamSpec.hpp"
#include "JHybridOutputStreamSpec.hpp"
#include "JHybridDuplexStreamSpec.hpp"
#include "JHybridStreamFactorySpec.hpp"
#include "JHybridWebSocketSpec.hpp"
#include "JFunc_void_std__string.hpp"
#include "JFunc_void_double_std__string.hpp"
#include "JFunc_void_std__shared_ptr_ArrayBuffer_.hpp"
#include "JHybridWebSocketManagerSpec.hpp"
#include <NitroModules/JNISharedPtr.hpp>
#include <NitroModules/DefaultConstructableObject.hpp>
#include "HybridCompressorFactory.hpp"

namespace margelo::nitro::fastio {

int initialize(JavaVM* vm) {
  using namespace margelo::nitro;
  using namespace margelo::nitro::fastio;
  using namespace facebook;

  return facebook::jni::initialize(vm, [] {
    // Register native JNI methods
    margelo::nitro::fastio::JHybridFileSystemSpec::registerNatives();
    margelo::nitro::fastio::JHybridNetworkSpec::registerNatives();
    margelo::nitro::fastio::JHybridInputStreamSpec::registerNatives();
    margelo::nitro::fastio::JHybridOutputStreamSpec::registerNatives();
    margelo::nitro::fastio::JHybridDuplexStreamSpec::registerNatives();
    margelo::nitro::fastio::JHybridStreamFactorySpec::registerNatives();
    margelo::nitro::fastio::JHybridWebSocketSpec::registerNatives();
    margelo::nitro::fastio::JFunc_void_std__string::registerNatives();
    margelo::nitro::fastio::JFunc_void_double_std__string::registerNatives();
    margelo::nitro::fastio::JFunc_void_std__string::registerNatives();
    margelo::nitro::fastio::JFunc_void_std__string::registerNatives();
    margelo::nitro::fastio::JFunc_void_std__shared_ptr_ArrayBuffer_::registerNatives();
    margelo::nitro::fastio::JHybridWebSocketManagerSpec::registerNatives();

    // Register Nitro Hybrid Objects
    HybridObjectRegistry::registerHybridObjectConstructor(
      "WebSocketManager",
      []() -> std::shared_ptr<HybridObject> {
        static DefaultConstructableObject<JHybridWebSocketManagerSpec::javaobject> object("com/margelo/nitro/fastio/HybridWebSocketManager");
        auto instance = object.create();
        auto globalRef = jni::make_global(instance);
        return JNISharedPtr::make_shared_from_jni<JHybridWebSocketManagerSpec>(globalRef);
      }
    );
    HybridObjectRegistry::registerHybridObjectConstructor(
      "FileSystem",
      []() -> std::shared_ptr<HybridObject> {
        static DefaultConstructableObject<JHybridFileSystemSpec::javaobject> object("com/margelo/nitro/fastio/HybridFileSystem");
        auto instance = object.create();
        auto globalRef = jni::make_global(instance);
        return JNISharedPtr::make_shared_from_jni<JHybridFileSystemSpec>(globalRef);
      }
    );
    HybridObjectRegistry::registerHybridObjectConstructor(
      "Network",
      []() -> std::shared_ptr<HybridObject> {
        static DefaultConstructableObject<JHybridNetworkSpec::javaobject> object("com/margelo/nitro/fastio/HybridNetwork");
        auto instance = object.create();
        auto globalRef = jni::make_global(instance);
        return JNISharedPtr::make_shared_from_jni<JHybridNetworkSpec>(globalRef);
      }
    );
    HybridObjectRegistry::registerHybridObjectConstructor(
      "DuplexStream",
      []() -> std::shared_ptr<HybridObject> {
        static DefaultConstructableObject<JHybridDuplexStreamSpec::javaobject> object("com/margelo/nitro/fastio/HybridDuplexStream");
        auto instance = object.create();
        auto globalRef = jni::make_global(instance);
        return JNISharedPtr::make_shared_from_jni<JHybridDuplexStreamSpec>(globalRef);
      }
    );
    HybridObjectRegistry::registerHybridObjectConstructor(
      "CompressorFactory",
      []() -> std::shared_ptr<HybridObject> {
        static_assert(std::is_default_constructible_v<HybridCompressorFactory>,
                      "The HybridObject \"HybridCompressorFactory\" is not default-constructible! "
                      "Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
        return std::make_shared<HybridCompressorFactory>();
      }
    );
    HybridObjectRegistry::registerHybridObjectConstructor(
      "StreamFactory",
      []() -> std::shared_ptr<HybridObject> {
        static DefaultConstructableObject<JHybridStreamFactorySpec::javaobject> object("com/margelo/nitro/fastio/HybridStreamFactory");
        auto instance = object.create();
        auto globalRef = jni::make_global(instance);
        return JNISharedPtr::make_shared_from_jni<JHybridStreamFactorySpec>(globalRef);
      }
    );
  });
}

} // namespace margelo::nitro::fastio
