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

#include "JHybridViewModelInstanceSpec.hpp"

// Forward declaration of `HybridViewModelNumberPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelNumberPropertySpec; }
// Forward declaration of `HybridViewModelStringPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelStringPropertySpec; }
// Forward declaration of `HybridViewModelBooleanPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelBooleanPropertySpec; }
// Forward declaration of `HybridViewModelColorPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelColorPropertySpec; }
// Forward declaration of `HybridViewModelEnumPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelEnumPropertySpec; }
// Forward declaration of `HybridViewModelTriggerPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelTriggerPropertySpec; }
// Forward declaration of `HybridViewModelImagePropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelImagePropertySpec; }
// Forward declaration of `HybridViewModelListPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelListPropertySpec; }
// Forward declaration of `HybridViewModelArtboardPropertySpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelArtboardPropertySpec; }
// Forward declaration of `HybridViewModelInstanceSpec` to properly resolve imports.
namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; }

#include <string>
#include <memory>
#include "HybridViewModelNumberPropertySpec.hpp"
#include <optional>
#include "JHybridViewModelNumberPropertySpec.hpp"
#include "HybridViewModelStringPropertySpec.hpp"
#include "JHybridViewModelStringPropertySpec.hpp"
#include "HybridViewModelBooleanPropertySpec.hpp"
#include "JHybridViewModelBooleanPropertySpec.hpp"
#include "HybridViewModelColorPropertySpec.hpp"
#include "JHybridViewModelColorPropertySpec.hpp"
#include "HybridViewModelEnumPropertySpec.hpp"
#include "JHybridViewModelEnumPropertySpec.hpp"
#include "HybridViewModelTriggerPropertySpec.hpp"
#include "JHybridViewModelTriggerPropertySpec.hpp"
#include "HybridViewModelImagePropertySpec.hpp"
#include "JHybridViewModelImagePropertySpec.hpp"
#include "HybridViewModelListPropertySpec.hpp"
#include "JHybridViewModelListPropertySpec.hpp"
#include "HybridViewModelArtboardPropertySpec.hpp"
#include "JHybridViewModelArtboardPropertySpec.hpp"
#include "HybridViewModelInstanceSpec.hpp"
#include "JHybridViewModelInstanceSpec.hpp"
#include <NitroModules/Promise.hpp>
#include <NitroModules/JPromise.hpp>

namespace margelo::nitro::rive {

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

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

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

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

  // Properties
  std::string JHybridViewModelInstanceSpec::getInstanceName() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JString>()>("getInstanceName");
    auto __result = method(_javaPart);
    return __result->toStdString();
  }

  // Methods
  std::optional<std::shared_ptr<HybridViewModelNumberPropertySpec>> JHybridViewModelInstanceSpec::numberProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelNumberPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("numberProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelNumberPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelStringPropertySpec>> JHybridViewModelInstanceSpec::stringProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelStringPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("stringProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelStringPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelBooleanPropertySpec>> JHybridViewModelInstanceSpec::booleanProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelBooleanPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("booleanProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelBooleanPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelColorPropertySpec>> JHybridViewModelInstanceSpec::colorProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelColorPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("colorProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelColorPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelEnumPropertySpec>> JHybridViewModelInstanceSpec::enumProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelEnumPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("enumProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelEnumPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelTriggerPropertySpec>> JHybridViewModelInstanceSpec::triggerProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelTriggerPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("triggerProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelTriggerPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelImagePropertySpec>> JHybridViewModelInstanceSpec::imageProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelImagePropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("imageProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelImagePropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelListPropertySpec>> JHybridViewModelInstanceSpec::listProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelListPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("listProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelListPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelArtboardPropertySpec>> JHybridViewModelInstanceSpec::artboardProperty(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelArtboardPropertySpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("artboardProperty");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelArtboardPropertySpec()) : std::nullopt;
  }
  std::optional<std::shared_ptr<HybridViewModelInstanceSpec>> JHybridViewModelInstanceSpec::viewModel(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JHybridViewModelInstanceSpec::JavaPart>(jni::alias_ref<jni::JString> /* path */)>("viewModel");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return __result != nullptr ? std::make_optional(__result->getJHybridViewModelInstanceSpec()) : std::nullopt;
  }
  std::shared_ptr<Promise<std::optional<std::shared_ptr<HybridViewModelInstanceSpec>>>> JHybridViewModelInstanceSpec::viewModelAsync(const std::string& path) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* path */)>("viewModelAsync");
    auto __result = method(_javaPart, jni::make_jstring(path));
    return [&]() {
      auto __promise = Promise<std::optional<std::shared_ptr<HybridViewModelInstanceSpec>>>::create();
      __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
        auto __result = jni::static_ref_cast<JHybridViewModelInstanceSpec::JavaPart>(__boxedResult);
        __promise->resolve(__result != nullptr ? std::make_optional(__result->getJHybridViewModelInstanceSpec()) : std::nullopt);
      });
      __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
        jni::JniException __jniError(__throwable);
        __promise->reject(std::make_exception_ptr(__jniError));
      });
      return __promise;
    }();
  }
  void JHybridViewModelInstanceSpec::replaceViewModel(const std::string& path, const std::shared_ptr<HybridViewModelInstanceSpec>& instance) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* path */, jni::alias_ref<JHybridViewModelInstanceSpec::JavaPart> /* instance */)>("replaceViewModel");
    method(_javaPart, jni::make_jstring(path), std::dynamic_pointer_cast<JHybridViewModelInstanceSpec>(instance)->getJavaPart());
  }

} // namespace margelo::nitro::rive
