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

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

#include "VisionCameraOnLoad.hpp"

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

#include "JHybridCameraControllerSpec.hpp"
#include "JFunc_void.hpp"
#include "JHybridCameraFactorySpec.hpp"
#include "JHybridFrameRendererSpec.hpp"
#include "JHybridNativeThreadSpec.hpp"
#include "JHybridNativeThreadFactorySpec.hpp"
#include "JHybridGestureControllerSpec.hpp"
#include "JHybridTapToFocusGestureControllerSpec.hpp"
#include "JHybridZoomGestureControllerSpec.hpp"
#include "JHybridCameraDeviceSpec.hpp"
#include "JHybridCameraDeviceFactorySpec.hpp"
#include "JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec__.hpp"
#include "JHybridCameraExtensionSpec.hpp"
#include "JHybridCameraCalibrationDataSpec.hpp"
#include "JHybridDepthSpec.hpp"
#include "JHybridFramePlaneSpec.hpp"
#include "JHybridFrameSpec.hpp"
#include "JHybridPhotoSpec.hpp"
#include "JHybridScannedObjectSpec.hpp"
#include "JHybridScannedCodeSpec.hpp"
#include "JHybridScannedFaceSpec.hpp"
#include "JHybridLocationSpec.hpp"
#include "JHybridMeteringPointSpec.hpp"
#include "JHybridOrientationManagerSpec.hpp"
#include "JFunc_void_CameraOrientation.hpp"
#include "JHybridCameraDepthFrameOutputSpec.hpp"
#include "JFunc_bool_std__shared_ptr_HybridDepthSpec_.hpp"
#include "JFunc_void_FrameDroppedReason.hpp"
#include "JHybridCameraFrameOutputSpec.hpp"
#include "JFunc_bool_std__shared_ptr_HybridFrameSpec_.hpp"
#include "JHybridCameraObjectOutputSpec.hpp"
#include "JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec__.hpp"
#include "JHybridCameraOutputSpec.hpp"
#include "JHybridCameraOutputSynchronizerSpec.hpp"
#include "JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec___.hpp"
#include "JFunc_void_MediaType_FrameDroppedReason.hpp"
#include "JHybridCameraPhotoOutputSpec.hpp"
#include "JFunc_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_.hpp"
#include "JHybridCameraPreviewOutputSpec.hpp"
#include "JHybridCameraVideoOutputSpec.hpp"
#include "JHybridRecorderSpec.hpp"
#include "JFunc_void_std__string_RecordingFinishedReason.hpp"
#include "JFunc_void_std__exception_ptr.hpp"
#include "JHybridCameraSessionSpec.hpp"
#include "JFunc_void_std__shared_ptr_HybridCameraSessionConfigSpec_.hpp"
#include "JFunc_void_InterruptionReason.hpp"
#include "JHybridCameraSessionConfigSpec.hpp"
#include "JHybridFrameConverterSpec.hpp"
#include "JHybridFrameRendererViewSpec.hpp"
#include "views/JHybridFrameRendererViewStateUpdater.hpp"
#include "JHybridPreviewViewSpec.hpp"
#include "views/JHybridPreviewViewStateUpdater.hpp"
#include <NitroModules/DefaultConstructableObject.hpp>

namespace margelo::nitro::camera {

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

struct JHybridCameraFactorySpecImpl: public jni::JavaClass<JHybridCameraFactorySpecImpl, JHybridCameraFactorySpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/VisionCamera;";
  static std::shared_ptr<JHybridCameraFactorySpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridCameraFactorySpecImpl::javaobject()>();
    jni::local_ref<JHybridCameraFactorySpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridCameraFactorySpec();
  }
};
struct JHybridPreviewViewSpecImpl: public jni::JavaClass<JHybridPreviewViewSpecImpl, JHybridPreviewViewSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/HybridPreviewView;";
  static std::shared_ptr<JHybridPreviewViewSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridPreviewViewSpecImpl::javaobject()>();
    jni::local_ref<JHybridPreviewViewSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridPreviewViewSpec();
  }
};
struct JHybridFrameRendererViewSpecImpl: public jni::JavaClass<JHybridFrameRendererViewSpecImpl, JHybridFrameRendererViewSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/HybridFrameRendererView;";
  static std::shared_ptr<JHybridFrameRendererViewSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridFrameRendererViewSpecImpl::javaobject()>();
    jni::local_ref<JHybridFrameRendererViewSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridFrameRendererViewSpec();
  }
};
struct JHybridNativeThreadFactorySpecImpl: public jni::JavaClass<JHybridNativeThreadFactorySpecImpl, JHybridNativeThreadFactorySpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/HybridNativeThreadFactory;";
  static std::shared_ptr<JHybridNativeThreadFactorySpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridNativeThreadFactorySpecImpl::javaobject()>();
    jni::local_ref<JHybridNativeThreadFactorySpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridNativeThreadFactorySpec();
  }
};
struct JHybridFrameConverterSpecImpl: public jni::JavaClass<JHybridFrameConverterSpecImpl, JHybridFrameConverterSpec::JavaPart> {
  static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/camera/HybridFrameConverter;";
  static std::shared_ptr<JHybridFrameConverterSpec> create() {
    static const auto constructorFn = javaClassStatic()->getConstructor<JHybridFrameConverterSpecImpl::javaobject()>();
    jni::local_ref<JHybridFrameConverterSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
    return javaPart->getJHybridFrameConverterSpec();
  }
};

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

  // Register native JNI methods
  margelo::nitro::camera::JHybridCameraControllerSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraFactorySpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridFrameRendererSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridNativeThreadSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridNativeThreadFactorySpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridGestureControllerSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridTapToFocusGestureControllerSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridZoomGestureControllerSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridCameraDeviceSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridCameraDeviceFactorySpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_std__vector_std__shared_ptr_HybridCameraDeviceSpec___cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraExtensionSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridCameraCalibrationDataSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridDepthSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridFramePlaneSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridFrameSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridPhotoSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridScannedObjectSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridScannedCodeSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridScannedFaceSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridLocationSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridMeteringPointSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridOrientationManagerSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_CameraOrientation_cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraDepthFrameOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_bool_std__shared_ptr_HybridDepthSpec__cxx::registerNatives();
  margelo::nitro::camera::JFunc_void_FrameDroppedReason_cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraFrameOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_bool_std__shared_ptr_HybridFrameSpec__cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraObjectOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_std__vector_std__shared_ptr_HybridScannedObjectSpec___cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridCameraOutputSynchronizerSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_bool_std__vector_std__variant_std__shared_ptr_HybridFrameSpec___std__shared_ptr_HybridDepthSpec____cxx::registerNatives();
  margelo::nitro::camera::JFunc_void_MediaType_FrameDroppedReason_cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraPhotoOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec__cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraPreviewOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridCameraVideoOutputSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridRecorderSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_std__string_RecordingFinishedReason_cxx::registerNatives();
  margelo::nitro::camera::JFunc_void_std__exception_ptr_cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraSessionSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JFunc_void_std__shared_ptr_HybridCameraSessionConfigSpec__cxx::registerNatives();
  margelo::nitro::camera::JFunc_void_InterruptionReason_cxx::registerNatives();
  margelo::nitro::camera::JHybridCameraSessionConfigSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridFrameConverterSpec::CxxPart::registerNatives();
  margelo::nitro::camera::JHybridFrameRendererViewSpec::CxxPart::registerNatives();
  margelo::nitro::camera::views::JHybridFrameRendererViewStateUpdater::registerNatives();
  margelo::nitro::camera::JHybridPreviewViewSpec::CxxPart::registerNatives();
  margelo::nitro::camera::views::JHybridPreviewViewStateUpdater::registerNatives();

  // Register Nitro Hybrid Objects
  HybridObjectRegistry::registerHybridObjectConstructor(
    "CameraFactory",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridCameraFactorySpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "PreviewView",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridPreviewViewSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "FrameRendererView",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridFrameRendererViewSpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "NativeThreadFactory",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridNativeThreadFactorySpecImpl::create();
    }
  );
  HybridObjectRegistry::registerHybridObjectConstructor(
    "FrameConverter",
    []() -> std::shared_ptr<HybridObject> {
      return JHybridFrameConverterSpecImpl::create();
    }
  );
}

} // namespace margelo::nitro::camera
