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

#ifndef BUILDING_REACTNATIVELIST_WITH_GENERATED_CMAKE_PROJECT
#error ReactNativeListOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this?
#endif

#include "ReactNativeListOnLoad.hpp"

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

#include "JHybridIOSWorkletsModuleProxyHolderSpec.hpp"
#include "JHybridNativeLinearListLayoutSpec.hpp"
#include "JHybridNativeListDataSourceSpec.hpp"
#include "JFunc_bool_NativeListItem_NativeListItem.hpp"
#include "JHybridNativeListLayoutSpec.hpp"
#include "JHybridUiListModuleSpec.hpp"
#include "JHybridUiListViewSpec.hpp"
#include "JFunc_double_std__string_double.hpp"
#include "JFunc_bool_double_NativeListItem_double.hpp"
#include "JFunc_bool_double.hpp"
#include "views/JHybridUiListViewStateUpdater.hpp"
#include "JHybridViewHolderSpec.hpp"
#include "views/JHybridViewHolderStateUpdater.hpp"
#include <NitroModules/DefaultConstructableObject.hpp>
#include "HybridUiManagerHelper.hpp"

namespace margelo::nitro::reactnativelist {

int initialize(JavaVM* vm) {
  return facebook::jni::initialize(vm, []() {
    ::margelo::nitro::reactnativelist::registerAllNatives();
  });
}

struct JHybridViewHolderSpecImpl: public jni::JavaClass<JHybridViewHolderSpecImpl, JHybridViewHolderSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativelist/HybridViewHolder;";
  static std::shared_ptr<JHybridViewHolderSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridViewHolderSpecImpl::javaobject()>();
    jni::local_ref<JHybridViewHolderSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridViewHolderSpec();
  }
};
struct JHybridUiListViewSpecImpl: public jni::JavaClass<JHybridUiListViewSpecImpl, JHybridUiListViewSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativelist/HybridUiListView;";
  static std::shared_ptr<JHybridUiListViewSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridUiListViewSpecImpl::javaobject()>();
    jni::local_ref<JHybridUiListViewSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridUiListViewSpec();
  }
};
struct JHybridNativeListDataSourceSpecImpl: public jni::JavaClass<JHybridNativeListDataSourceSpecImpl, JHybridNativeListDataSourceSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativelist/HybridNativeListDataSource;";
  static std::shared_ptr<JHybridNativeListDataSourceSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridNativeListDataSourceSpecImpl::javaobject()>();
    jni::local_ref<JHybridNativeListDataSourceSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridNativeListDataSourceSpec();
  }
};
struct JHybridNativeListLayoutSpecImpl: public jni::JavaClass<JHybridNativeListLayoutSpecImpl, JHybridNativeListLayoutSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativelist/HybridNativeListLayout;";
  static std::shared_ptr<JHybridNativeListLayoutSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridNativeListLayoutSpecImpl::javaobject()>();
    jni::local_ref<JHybridNativeListLayoutSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridNativeListLayoutSpec();
  }
};
struct JHybridNativeLinearListLayoutSpecImpl: public jni::JavaClass<JHybridNativeLinearListLayoutSpecImpl, JHybridNativeLinearListLayoutSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativelist/HybridNativeLinearListLayout;";
  static std::shared_ptr<JHybridNativeLinearListLayoutSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridNativeLinearListLayoutSpecImpl::javaobject()>();
    jni::local_ref<JHybridNativeLinearListLayoutSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridNativeLinearListLayoutSpec();
  }
};
struct JHybridUiListModuleSpecImpl: public jni::JavaClass<JHybridUiListModuleSpecImpl, JHybridUiListModuleSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativelist/HybridUiListModule;";
  static std::shared_ptr<JHybridUiListModuleSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridUiListModuleSpecImpl::javaobject()>();
    jni::local_ref<JHybridUiListModuleSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridUiListModuleSpec();
  }
};

void registerAllNatives() {
  using namespace margelo::nitro;
  using namespace margelo::nitro::reactnativelist;

  // Register native JNI methods
  margelo::nitro::reactnativelist::JHybridIOSWorkletsModuleProxyHolderSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::JHybridNativeLinearListLayoutSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::JHybridNativeListDataSourceSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::JFunc_bool_NativeListItem_NativeListItem_cxx::registerNatives();
  margelo::nitro::reactnativelist::JHybridNativeListLayoutSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::JHybridUiListModuleSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::JHybridUiListViewSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::JFunc_double_std__string_double_cxx::registerNatives();
  margelo::nitro::reactnativelist::JFunc_bool_double_NativeListItem_double_cxx::registerNatives();
  margelo::nitro::reactnativelist::JFunc_bool_double_cxx::registerNatives();
  margelo::nitro::reactnativelist::views::JHybridUiListViewStateUpdater::registerNatives();
  margelo::nitro::reactnativelist::JHybridViewHolderSpec::CxxPart::registerNatives();
  margelo::nitro::reactnativelist::views::JHybridViewHolderStateUpdater::registerNatives();

  // Register Nitro Hybrid Objects
  HybridObjectRegistry::registerHybridObjectConstructor(
    "ViewHolder",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridViewHolderSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "UiListView",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridUiListViewSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "NativeListDataSource",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridNativeListDataSourceSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "NativeListLayout",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridNativeListLayoutSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "NativeLinearListLayout",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridNativeLinearListLayoutSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "UiListModule",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridUiListModuleSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "UiManagerHelper",
    []() -> std::shared_ptr<HybridObject> {
      static_assert(std::is_default_constructible_v<HybridUiManagerHelper>,
                    "The HybridObject \"HybridUiManagerHelper\" is not default-constructible! "
                    "Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
      return std::make_shared<HybridUiManagerHelper>();
    }
  );
}

} // namespace margelo::nitro::reactnativelist
