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

#pragma once

#if __has_include(<NitroModules/HybridObject.hpp>)
#include <NitroModules/HybridObject.hpp>
#else
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
#endif

// 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 `onLoadStartData` to properly resolve imports.
namespace margelo::nitro::video { struct onLoadStartData; }
// 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 `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 "onLoadData.hpp"
#include "onLoadStartData.hpp"
#include "onPlaybackStateChangeData.hpp"
#include "onProgressData.hpp"
#include "TimedMetadata.hpp"
#include <string>
#include <vector>
#include "TextTrack.hpp"
#include <optional>
#include "onVolumeChangeData.hpp"
#include "VideoPlayerStatus.hpp"

namespace margelo::nitro::video {

  using namespace margelo::nitro;

  /**
   * An abstract base class for `VideoPlayerEventEmitter`
   * Inherit this class to create instances of `HybridVideoPlayerEventEmitterSpec` in C++.
   * You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
   * @example
   * ```cpp
   * class HybridVideoPlayerEventEmitter: public HybridVideoPlayerEventEmitterSpec {
   * public:
   *   HybridVideoPlayerEventEmitter(...): HybridObject(TAG) { ... }
   *   // ...
   * };
   * ```
   */
  class HybridVideoPlayerEventEmitterSpec: public virtual HybridObject {
    public:
      // Constructor
      explicit HybridVideoPlayerEventEmitterSpec(): HybridObject(TAG) { }

      // Destructor
      ~HybridVideoPlayerEventEmitterSpec() override = default;

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

    public:
      // Methods
      

    protected:
      // Hybrid Setup
      void loadHybridMethods() override;

    protected:
      // Tag for logging
      static constexpr auto TAG = "VideoPlayerEventEmitter";
  };

} // namespace margelo::nitro::video
