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

#include "JHybridVideoViewStateUpdater.hpp"
#include "views/HybridVideoViewComponent.hpp"
#include <NitroModules/NitroDefines.hpp>
#include <react/fabric/StateWrapperImpl.h>

namespace margelo::nitro::aviation::views {

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

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

  // Get concrete StateWrapperImpl from passed StateWrapper interface object
  jobject rawStateWrapper = stateWrapperInterface.get();
  if (!stateWrapperInterface->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
      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::static_pointer_cast<const ConcreteStateData>(state);
  const HybridVideoViewState& data = concreteState->getData();
  const std::shared_ptr<HybridVideoViewProps>& props = data.getProps();
  if (props == nullptr) [[unlikely]] {
    // Props aren't set yet!
    throw std::runtime_error("HybridVideoViewState's data doesn't contain any props!");
  }

  // Update all props if they are dirty
  if (props->resizeMode.isDirty) {
    view->setResizeMode(props->resizeMode.value);
    props->resizeMode.isDirty = false;
  }
  if (props->pipEnabled.isDirty) {
    view->setPipEnabled(props->pipEnabled.value);
    props->pipEnabled.isDirty = false;
  }
  if (props->playInBackground.isDirty) {
    view->setPlayInBackground(props->playInBackground.value);
    props->playInBackground.isDirty = false;
  }
  if (props->onPipStart.isDirty) {
    view->setOnPipStart(props->onPipStart.value);
    props->onPipStart.isDirty = false;
  }
  if (props->onPipStop.isDirty) {
    view->setOnPipStop(props->onPipStop.value);
    props->onPipStop.isDirty = false;
  }
  if (props->surfaceType.isDirty) {
    view->setSurfaceType(props->surfaceType.value);
    props->surfaceType.isDirty = false;
  }
  if (props->onFullscreenEnter.isDirty) {
    view->setOnFullscreenEnter(props->onFullscreenEnter.value);
    props->onFullscreenEnter.isDirty = false;
  }
  if (props->onFullscreenExit.isDirty) {
    view->setOnFullscreenExit(props->onFullscreenExit.value);
    props->onFullscreenExit.isDirty = false;
  }
  if (props->selectedVideoTrack.isDirty) {
    view->setSelectedVideoTrack(props->selectedVideoTrack.value);
    props->selectedVideoTrack.isDirty = false;
  }
  if (props->selectedSubtitleTrack.isDirty) {
    view->setSelectedSubtitleTrack(props->selectedSubtitleTrack.value);
    props->selectedSubtitleTrack.isDirty = false;
  }
  if (props->selectedAudioTrack.isDirty) {
    view->setSelectedAudioTrack(props->selectedAudioTrack.value);
    props->selectedAudioTrack.isDirty = false;
  }
  if (props->adTagUrl.isDirty) {
    view->setAdTagUrl(props->adTagUrl.value);
    props->adTagUrl.isDirty = false;
  }
  if (props->source.isDirty) {
    view->setSource(props->source.value);
    props->source.isDirty = false;
  }
  if (props->autoPlay.isDirty) {
    view->setAutoPlay(props->autoPlay.value);
    props->autoPlay.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<JHybridVideoViewSpec> shared = javaView->cthis()->shared_cast<JHybridVideoViewSpec>();
      maybeFunc.value()(shared);
    }
    props->hybridRef.isDirty = false;
  }
}

} // namespace margelo::nitro::aviation::views
