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

#pragma once

#include "HybridVideoPlayerEventEmitterSpec.hpp"

// Forward declaration of `HybridVideoPlayerEventEmitterSpec_cxx` to properly resolve imports.
namespace ReactNativeVideo { class HybridVideoPlayerEventEmitterSpec_cxx; }

// Forward declaration of `BandwidthData` to properly resolve imports.
namespace margelo::nitro::video { struct BandwidthData; }
// Forward declaration of `onLoadData` to properly resolve imports.
namespace margelo::nitro::video { struct onLoadData; }
// Forward declaration of `VideoOrientation` to properly resolve imports.
namespace margelo::nitro::video { enum class VideoOrientation; }
// Forward declaration of `onLoadStartData` to properly resolve imports.
namespace margelo::nitro::video { struct onLoadStartData; }
// Forward declaration of `SourceType` to properly resolve imports.
namespace margelo::nitro::video { enum class SourceType; }
// Forward declaration of `HybridVideoPlayerSourceSpec` to properly resolve imports.
namespace margelo::nitro::video { class HybridVideoPlayerSourceSpec; }
// Forward declaration of `onPlaybackStateChangeData` to properly resolve imports.
namespace margelo::nitro::video { struct onPlaybackStateChangeData; }
// Forward declaration of `onProgressData` to properly resolve imports.
namespace margelo::nitro::video { struct onProgressData; }
// Forward declaration of `TimedMetadata` to properly resolve imports.
namespace margelo::nitro::video { struct TimedMetadata; }
// Forward declaration of `TimedMetadataObject` to properly resolve imports.
namespace margelo::nitro::video { struct TimedMetadataObject; }
// Forward declaration of `TextTrack` to properly resolve imports.
namespace margelo::nitro::video { struct TextTrack; }
// Forward declaration of `onVolumeChangeData` to properly resolve imports.
namespace margelo::nitro::video { struct onVolumeChangeData; }
// Forward declaration of `VideoPlayerStatus` to properly resolve imports.
namespace margelo::nitro::video { enum class VideoPlayerStatus; }

#include <functional>
#include "BandwidthData.hpp"
#include <optional>
#include "onLoadData.hpp"
#include "VideoOrientation.hpp"
#include "onLoadStartData.hpp"
#include "SourceType.hpp"
#include <memory>
#include "HybridVideoPlayerSourceSpec.hpp"
#include "onPlaybackStateChangeData.hpp"
#include "onProgressData.hpp"
#include "TimedMetadata.hpp"
#include "TimedMetadataObject.hpp"
#include <vector>
#include <string>
#include "TextTrack.hpp"
#include "onVolumeChangeData.hpp"
#include "VideoPlayerStatus.hpp"

#include "ReactNativeVideo-Swift-Cxx-Umbrella.hpp"

namespace margelo::nitro::video {

  /**
   * The C++ part of HybridVideoPlayerEventEmitterSpec_cxx.swift.
   *
   * HybridVideoPlayerEventEmitterSpecSwift (C++) accesses HybridVideoPlayerEventEmitterSpec_cxx (Swift), and might
   * contain some additional bridging code for C++ <> Swift interop.
   *
   * Since this obviously introduces an overhead, I hope at some point in
   * the future, HybridVideoPlayerEventEmitterSpec_cxx can directly inherit from the C++ class HybridVideoPlayerEventEmitterSpec
   * to simplify the whole structure and memory management.
   */
  class HybridVideoPlayerEventEmitterSpecSwift: public virtual HybridVideoPlayerEventEmitterSpec {
  public:
    // Constructor from a Swift instance
    explicit HybridVideoPlayerEventEmitterSpecSwift(const ReactNativeVideo::HybridVideoPlayerEventEmitterSpec_cxx& swiftPart):
      HybridObject(HybridVideoPlayerEventEmitterSpec::TAG),
      _swiftPart(swiftPart) { }

  public:
    // Get the Swift part
    inline ReactNativeVideo::HybridVideoPlayerEventEmitterSpec_cxx& getSwiftPart() noexcept {
      return _swiftPart;
    }

  public:
    inline size_t getExternalMemorySize() noexcept override {
      return _swiftPart.getMemorySize();
    }
    void dispose() noexcept override {
      _swiftPart.dispose();
    }

  public:
    // Properties
    inline std::function<void()> getOnAudioBecomingNoisy() noexcept override {
      auto __result = _swiftPart.getOnAudioBecomingNoisy();
      return __result;
    }
    inline void setOnAudioBecomingNoisy(const std::function<void()>& onAudioBecomingNoisy) noexcept override {
      _swiftPart.setOnAudioBecomingNoisy(onAudioBecomingNoisy);
    }
    inline std::function<void(bool /* hasAudioFocus */)> getOnAudioFocusChange() noexcept override {
      auto __result = _swiftPart.getOnAudioFocusChange();
      return __result;
    }
    inline void setOnAudioFocusChange(const std::function<void(bool /* hasAudioFocus */)>& onAudioFocusChange) noexcept override {
      _swiftPart.setOnAudioFocusChange(onAudioFocusChange);
    }
    inline std::function<void(const BandwidthData& /* data */)> getOnBandwidthUpdate() noexcept override {
      auto __result = _swiftPart.getOnBandwidthUpdate();
      return __result;
    }
    inline void setOnBandwidthUpdate(const std::function<void(const BandwidthData& /* data */)>& onBandwidthUpdate) noexcept override {
      _swiftPart.setOnBandwidthUpdate(onBandwidthUpdate);
    }
    inline std::function<void(bool /* buffering */)> getOnBuffer() noexcept override {
      auto __result = _swiftPart.getOnBuffer();
      return __result;
    }
    inline void setOnBuffer(const std::function<void(bool /* buffering */)>& onBuffer) noexcept override {
      _swiftPart.setOnBuffer(onBuffer);
    }
    inline std::function<void(bool /* visible */)> getOnControlsVisibleChange() noexcept override {
      auto __result = _swiftPart.getOnControlsVisibleChange();
      return __result;
    }
    inline void setOnControlsVisibleChange(const std::function<void(bool /* visible */)>& onControlsVisibleChange) noexcept override {
      _swiftPart.setOnControlsVisibleChange(onControlsVisibleChange);
    }
    inline std::function<void()> getOnEnd() noexcept override {
      auto __result = _swiftPart.getOnEnd();
      return __result;
    }
    inline void setOnEnd(const std::function<void()>& onEnd) noexcept override {
      _swiftPart.setOnEnd(onEnd);
    }
    inline std::function<void(bool /* externalPlaybackActive */)> getOnExternalPlaybackChange() noexcept override {
      auto __result = _swiftPart.getOnExternalPlaybackChange();
      return __result;
    }
    inline void setOnExternalPlaybackChange(const std::function<void(bool /* externalPlaybackActive */)>& onExternalPlaybackChange) noexcept override {
      _swiftPart.setOnExternalPlaybackChange(onExternalPlaybackChange);
    }
    inline std::function<void(const onLoadData& /* data */)> getOnLoad() noexcept override {
      auto __result = _swiftPart.getOnLoad();
      return __result;
    }
    inline void setOnLoad(const std::function<void(const onLoadData& /* data */)>& onLoad) noexcept override {
      _swiftPart.setOnLoad(onLoad);
    }
    inline std::function<void(const onLoadStartData& /* data */)> getOnLoadStart() noexcept override {
      auto __result = _swiftPart.getOnLoadStart();
      return __result;
    }
    inline void setOnLoadStart(const std::function<void(const onLoadStartData& /* data */)>& onLoadStart) noexcept override {
      _swiftPart.setOnLoadStart(onLoadStart);
    }
    inline std::function<void(const onPlaybackStateChangeData& /* data */)> getOnPlaybackStateChange() noexcept override {
      auto __result = _swiftPart.getOnPlaybackStateChange();
      return __result;
    }
    inline void setOnPlaybackStateChange(const std::function<void(const onPlaybackStateChangeData& /* data */)>& onPlaybackStateChange) noexcept override {
      _swiftPart.setOnPlaybackStateChange(onPlaybackStateChange);
    }
    inline std::function<void(double /* rate */)> getOnPlaybackRateChange() noexcept override {
      auto __result = _swiftPart.getOnPlaybackRateChange();
      return __result;
    }
    inline void setOnPlaybackRateChange(const std::function<void(double /* rate */)>& onPlaybackRateChange) noexcept override {
      _swiftPart.setOnPlaybackRateChange(onPlaybackRateChange);
    }
    inline std::function<void(const onProgressData& /* data */)> getOnProgress() noexcept override {
      auto __result = _swiftPart.getOnProgress();
      return __result;
    }
    inline void setOnProgress(const std::function<void(const onProgressData& /* data */)>& onProgress) noexcept override {
      _swiftPart.setOnProgress(onProgress);
    }
    inline std::function<void()> getOnReadyToDisplay() noexcept override {
      auto __result = _swiftPart.getOnReadyToDisplay();
      return __result;
    }
    inline void setOnReadyToDisplay(const std::function<void()>& onReadyToDisplay) noexcept override {
      _swiftPart.setOnReadyToDisplay(onReadyToDisplay);
    }
    inline std::function<void(double /* seekTime */)> getOnSeek() noexcept override {
      auto __result = _swiftPart.getOnSeek();
      return __result;
    }
    inline void setOnSeek(const std::function<void(double /* seekTime */)>& onSeek) noexcept override {
      _swiftPart.setOnSeek(onSeek);
    }
    inline std::function<void(const TimedMetadata& /* metadata */)> getOnTimedMetadata() noexcept override {
      auto __result = _swiftPart.getOnTimedMetadata();
      return __result;
    }
    inline void setOnTimedMetadata(const std::function<void(const TimedMetadata& /* metadata */)>& onTimedMetadata) noexcept override {
      _swiftPart.setOnTimedMetadata(onTimedMetadata);
    }
    inline std::function<void(const std::vector<std::string>& /* texts */)> getOnTextTrackDataChanged() noexcept override {
      auto __result = _swiftPart.getOnTextTrackDataChanged();
      return __result;
    }
    inline void setOnTextTrackDataChanged(const std::function<void(const std::vector<std::string>& /* texts */)>& onTextTrackDataChanged) noexcept override {
      _swiftPart.setOnTextTrackDataChanged(onTextTrackDataChanged);
    }
    inline std::function<void(const std::optional<TextTrack>& /* track */)> getOnTrackChange() noexcept override {
      auto __result = _swiftPart.getOnTrackChange();
      return __result;
    }
    inline void setOnTrackChange(const std::function<void(const std::optional<TextTrack>& /* track */)>& onTrackChange) noexcept override {
      _swiftPart.setOnTrackChange(onTrackChange);
    }
    inline std::function<void(const onVolumeChangeData& /* data */)> getOnVolumeChange() noexcept override {
      auto __result = _swiftPart.getOnVolumeChange();
      return __result;
    }
    inline void setOnVolumeChange(const std::function<void(const onVolumeChangeData& /* data */)>& onVolumeChange) noexcept override {
      _swiftPart.setOnVolumeChange(onVolumeChange);
    }
    inline std::function<void(VideoPlayerStatus /* status */)> getOnStatusChange() noexcept override {
      auto __result = _swiftPart.getOnStatusChange();
      return __result;
    }
    inline void setOnStatusChange(const std::function<void(VideoPlayerStatus /* status */)>& onStatusChange) noexcept override {
      _swiftPart.setOnStatusChange(onStatusChange);
    }

  public:
    // Methods
    

  private:
    ReactNativeVideo::HybridVideoPlayerEventEmitterSpec_cxx _swiftPart;
  };

} // namespace margelo::nitro::video
