/**
 * @file src/stream.h
 * @brief Declarations for the streaming protocols.
 */
#pragma once
#include <utility>

#include <boost/asio.hpp>

#include "audio.h"
#include "crypto.h"
#include "video.h"

namespace stream {
  constexpr auto VIDEO_STREAM_PORT = 9;
  constexpr auto CONTROL_PORT = 10;
  constexpr auto AUDIO_STREAM_PORT = 11;

  struct session_t;
  struct config_t {
    audio::config_t audio;
    video::config_t monitor;

    int packetsize;
    int minRequiredFecPackets;
    int mlFeatureFlags;
    int controlProtocolType;
    int audioQosType;
    int videoQosType;

    uint32_t encryptionFlagsEnabled;

    std::optional<int> gcmap;
  };

  namespace session {
    enum class state_e : int {
      STOPPED,  ///< The session is stopped
      STOPPING,  ///< The session is stopping
      STARTING,  ///< The session is starting
      RUNNING,  ///< The session is running
    };

    std::shared_ptr<session_t>
    alloc(config_t &config, rtsp_stream::launch_session_t &launch_session);
    std::string
    uuid(const session_t& session);
    bool
    uuid_match(const session_t& session, const std::string& uuid);
    bool
    update_device_info(session_t& session, const std::string& name, const crypto::PERM& newPerm);
    int
    start(session_t &session, const std::string &addr_string);
    void
    stop(session_t &session);
    void
    graceful_stop(session_t& session);
    void
    join(session_t &session);
    state_e
    state(session_t &session);
    inline bool
    send(session_t& session);
  }  // namespace session
}  // namespace stream
