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

#include "JHybridNativeListDataSourceSpec.hpp"

// Forward declaration of `NativeListItem` to properly resolve imports.
namespace margelo::nitro::reactnativelist { struct NativeListItem; }

#include "NativeListItem.hpp"
#include "JNativeListItem.hpp"
#include <string>
#include <optional>
#include <NitroModules/AnyMap.hpp>
#include <NitroModules/JAnyMap.hpp>
#include <functional>
#include "JFunc_bool_NativeListItem_NativeListItem.hpp"
#include <NitroModules/JNICallable.hpp>
#include <vector>

namespace margelo::nitro::reactnativelist {

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

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

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

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

  // Properties
  

  // Methods
  void JHybridNativeListDataSourceSpec::setContentEqualCallback(const std::function<bool(const NativeListItem& /* oldItem */, const NativeListItem& /* newItem */)>& isContentEqual) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JFunc_bool_NativeListItem_NativeListItem::javaobject> /* isContentEqual */)>("setContentEqualCallback_cxx");
    method(_javaPart, JFunc_bool_NativeListItem_NativeListItem_cxx::fromCpp(isContentEqual));
  }
  void JHybridNativeListDataSourceSpec::replaceData(const std::vector<NativeListItem>& items, bool animated) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JArrayClass<JNativeListItem>> /* items */, jboolean /* animated */)>("replaceData");
    method(_javaPart, [&](auto&& __input) {
      size_t __size = __input.size();
      jni::local_ref<jni::JArrayClass<JNativeListItem>> __array = jni::JArrayClass<JNativeListItem>::newArray(__size);
      for (size_t __i = 0; __i < __size; __i++) {
        const auto& __element = __input[__i];
        auto __elementJni = JNativeListItem::fromCpp(__element);
        __array->setElement(__i, *__elementJni);
      }
      return __array;
    }(items), animated);
  }
  void JHybridNativeListDataSourceSpec::insertItem(double index, const NativeListItem& item) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* index */, jni::alias_ref<JNativeListItem> /* item */)>("insertItem");
    method(_javaPart, index, JNativeListItem::fromCpp(item));
  }
  void JHybridNativeListDataSourceSpec::updateItem(double index, const NativeListItem& item) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* index */, jni::alias_ref<JNativeListItem> /* item */)>("updateItem");
    method(_javaPart, index, JNativeListItem::fromCpp(item));
  }
  void JHybridNativeListDataSourceSpec::removeItem(double index) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* index */)>("removeItem");
    method(_javaPart, index);
  }
  void JHybridNativeListDataSourceSpec::moveItem(double fromIndex, double toIndex) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(double /* fromIndex */, double /* toIndex */)>("moveItem");
    method(_javaPart, fromIndex, toIndex);
  }
  double JHybridNativeListDataSourceSpec::getCount() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<double()>("getCount");
    auto __result = method(_javaPart);
    return __result;
  }
  NativeListItem JHybridNativeListDataSourceSpec::getItem(double index) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JNativeListItem>(double /* index */)>("getItem");
    auto __result = method(_javaPart, index);
    return __result->toCpp();
  }

} // namespace margelo::nitro::reactnativelist
