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

#include "JHybridHapticSpec.hpp"

// Forward declaration of `HapticPreset` to properly resolve imports.
namespace margelo::nitro::haptic { enum class HapticPreset; }
// Forward declaration of `HapticPattern` to properly resolve imports.
namespace margelo::nitro::haptic { struct HapticPattern; }
// Forward declaration of `HapticEvent` to properly resolve imports.
namespace margelo::nitro::haptic { struct HapticEvent; }
// Forward declaration of `HapticEventType` to properly resolve imports.
namespace margelo::nitro::haptic { enum class HapticEventType; }
// Forward declaration of `HapticParameters` to properly resolve imports.
namespace margelo::nitro::haptic { struct HapticParameters; }

#include "HapticPreset.hpp"
#include "JHapticPreset.hpp"
#include "HapticPattern.hpp"
#include "JHapticPattern.hpp"
#include "HapticEvent.hpp"
#include <vector>
#include "JHapticEvent.hpp"
#include "HapticEventType.hpp"
#include "JHapticEventType.hpp"
#include <optional>
#include "HapticParameters.hpp"
#include "JHapticParameters.hpp"

namespace margelo::nitro::haptic {

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

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

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

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

  // Properties
  

  // Methods
  bool JHybridHapticSpec::isAvailable() {
    static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isAvailable");
    auto __result = method(_javaPart);
    return static_cast<bool>(__result);
  }
  void JHybridHapticSpec::notify(HapticPreset preset) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JHapticPreset> /* preset */)>("notify");
    method(_javaPart, JHapticPreset::fromCpp(preset));
  }
  void JHybridHapticSpec::play(const HapticPattern& pattern) {
    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JHapticPattern> /* pattern */)>("play");
    method(_javaPart, JHapticPattern::fromCpp(pattern));
  }

} // namespace margelo::nitro::haptic
