///
/// HybridVideoViewSpec.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © 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 `ResizeMode` to properly resolve imports.
namespace margelo::nitro::aviation { enum class ResizeMode; }
// Forward declaration of `SurfaceType` to properly resolve imports.
namespace margelo::nitro::aviation { enum class SurfaceType; }
// Forward declaration of `VideoTrackSelection` to properly resolve imports.
namespace margelo::nitro::aviation { struct VideoTrackSelection; }
// Forward declaration of `SubtitleTrackSelection` to properly resolve imports.
namespace margelo::nitro::aviation { struct SubtitleTrackSelection; }
// Forward declaration of `AudioTrackSelection` to properly resolve imports.
namespace margelo::nitro::aviation { struct AudioTrackSelection; }
// Forward declaration of `VideoSource` to properly resolve imports.
namespace margelo::nitro::aviation { struct VideoSource; }
// Forward declaration of `HybridPlaybackEngineSpec` to properly resolve imports.
namespace margelo::nitro::aviation { class HybridPlaybackEngineSpec; }
// Forward declaration of `FullscreenConfig` to properly resolve imports.
namespace margelo::nitro::aviation { struct FullscreenConfig; }

#include "ResizeMode.hpp"
#include <functional>
#include "SurfaceType.hpp"
#include "VideoTrackSelection.hpp"
#include "SubtitleTrackSelection.hpp"
#include "AudioTrackSelection.hpp"
#include <string>
#include "VideoSource.hpp"
#include <memory>
#include "HybridPlaybackEngineSpec.hpp"
#include "FullscreenConfig.hpp"
#include <optional>

namespace margelo::nitro::aviation {

  using namespace margelo::nitro;

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

      // Destructor
      ~HybridVideoViewSpec() override = default;

    public:
      // Properties
      virtual ResizeMode getResizeMode() = 0;
      virtual void setResizeMode(ResizeMode resizeMode) = 0;
      virtual bool getPipEnabled() = 0;
      virtual void setPipEnabled(bool pipEnabled) = 0;
      virtual bool getPlayInBackground() = 0;
      virtual void setPlayInBackground(bool playInBackground) = 0;
      virtual std::function<void()> getOnPipStart() = 0;
      virtual void setOnPipStart(const std::function<void()>& onPipStart) = 0;
      virtual std::function<void()> getOnPipStop() = 0;
      virtual void setOnPipStop(const std::function<void()>& onPipStop) = 0;
      virtual SurfaceType getSurfaceType() = 0;
      virtual void setSurfaceType(SurfaceType surfaceType) = 0;
      virtual std::function<void()> getOnFullscreenEnter() = 0;
      virtual void setOnFullscreenEnter(const std::function<void()>& onFullscreenEnter) = 0;
      virtual std::function<void()> getOnFullscreenExit() = 0;
      virtual void setOnFullscreenExit(const std::function<void()>& onFullscreenExit) = 0;
      virtual VideoTrackSelection getSelectedVideoTrack() = 0;
      virtual void setSelectedVideoTrack(const VideoTrackSelection& selectedVideoTrack) = 0;
      virtual SubtitleTrackSelection getSelectedSubtitleTrack() = 0;
      virtual void setSelectedSubtitleTrack(const SubtitleTrackSelection& selectedSubtitleTrack) = 0;
      virtual AudioTrackSelection getSelectedAudioTrack() = 0;
      virtual void setSelectedAudioTrack(const AudioTrackSelection& selectedAudioTrack) = 0;
      virtual std::string getAdTagUrl() = 0;
      virtual void setAdTagUrl(const std::string& adTagUrl) = 0;
      virtual VideoSource getSource() = 0;
      virtual void setSource(const VideoSource& source) = 0;
      virtual bool getAutoPlay() = 0;
      virtual void setAutoPlay(bool autoPlay) = 0;

    public:
      // Methods
      virtual void attachEngine(const std::shared_ptr<HybridPlaybackEngineSpec>& engine) = 0;
      virtual void detachEngine() = 0;
      virtual void startPictureInPicture() = 0;
      virtual void stopPictureInPicture() = 0;
      virtual void enterFullscreen(const std::optional<FullscreenConfig>& config) = 0;
      virtual void exitFullscreen() = 0;
      virtual bool isFullscreen() = 0;
      virtual void enterNativeFullscreen() = 0;
      virtual void applyVideoTrack(const VideoTrackSelection& selection) = 0;
      virtual void applySubtitleTrack(const SubtitleTrackSelection& selection) = 0;
      virtual void applyAudioTrack(const AudioTrackSelection& selection) = 0;

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

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

} // namespace margelo::nitro::aviation
