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

#include "JHybridNitroVtoViewStateUpdater.hpp"
#include "views/HybridNitroVtoViewComponent.hpp"
#include <NitroModules/NitroDefines.hpp>

namespace margelo::nitro::nitrovto::views {

using namespace facebook;
using ConcreteStateData = react::ConcreteState<HybridNitroVtoViewState>;

void JHybridNitroVtoViewStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
                                           jni::alias_ref<JHybridNitroVtoViewSpec::javaobject> javaView,
                                           jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface) {
  JHybridNitroVtoViewSpec* view = javaView->cthis();

  // Get concrete StateWrapperImpl from passed StateWrapper interface object
  jobject rawStateWrapper = stateWrapperInterface.get();
  if (!stateWrapperInterface->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) {
      throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
  }
  auto stateWrapper = jni::alias_ref<react::StateWrapperImpl::javaobject>{
            static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)};

  std::shared_ptr<const react::State> state = stateWrapper->cthis()->getState();
  auto concreteState = std::dynamic_pointer_cast<const ConcreteStateData>(state);
  const HybridNitroVtoViewState& data = concreteState->getData();
  const std::optional<HybridNitroVtoViewProps>& maybeProps = data.getProps();
  if (!maybeProps.has_value()) {
    // Props aren't set yet!
    throw std::runtime_error("HybridNitroVtoViewState's data doesn't contain any props!");
  }
  const HybridNitroVtoViewProps& props = maybeProps.value();
  if (props.modelUrl.isDirty) {
    view->setModelUrl(props.modelUrl.value);
    // TODO: Set isDirty = false
  }
  if (props.isActive.isDirty) {
    view->setIsActive(props.isActive.value);
    // TODO: Set isDirty = false
  }
  if (props.onModelLoaded.isDirty) {
    view->setOnModelLoaded(props.onModelLoaded.value);
    // TODO: Set isDirty = false
  }
  if (props.onFaceTracked.isDirty) {
    view->setOnFaceTracked(props.onFaceTracked.value);
    // TODO: Set isDirty = false
  }
  if (props.onGlassesDisplayed.isDirty) {
    view->setOnGlassesDisplayed(props.onGlassesDisplayed.value);
    // TODO: Set isDirty = false
  }
  if (props.forwardOffset.isDirty) {
    view->setForwardOffset(props.forwardOffset.value);
    // TODO: Set isDirty = false
  }
  if (props.debug.isDirty) {
    view->setDebug(props.debug.value);
    // TODO: Set isDirty = false
  }
  if (props.showNativeFPS.isDirty) {
    view->setShowNativeFPS(props.showNativeFPS.value);
    // TODO: Set isDirty = false
  }
  if (props.isClipOn.isDirty) {
    view->setIsClipOn(props.isClipOn.value);
    // TODO: Set isDirty = false
  }

  // Update hybridRef if it changed
  if (props.hybridRef.isDirty) {
    // hybridRef changed - call it with new this
    const auto& maybeFunc = props.hybridRef.value;
    if (maybeFunc.has_value()) {
      std::shared_ptr<JHybridNitroVtoViewSpec> shared = javaView->cthis()->shared_cast<JHybridNitroVtoViewSpec>();
      maybeFunc.value()(shared);
    }
    // TODO: Set isDirty = false
  }
}

} // namespace margelo::nitro::nitrovto::views
