// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_MEDIA_PLAYBACK_MEDIAPLAYER_TEST_MEDIAPLAYER_TEST_UTIL_PARAMS_H_
#define SRC_MEDIA_PLAYBACK_MEDIAPLAYER_TEST_MEDIAPLAYER_TEST_UTIL_PARAMS_H_

#include <string>
#include <vector>

#include "src/lib/fxl/command_line.h"

namespace media_player {
namespace test {

class MediaPlayerTestUtilParams {
 public:
  MediaPlayerTestUtilParams(const fxl::CommandLine& command_line);

  bool is_valid() const { return is_valid_; }

  bool play() const { return play_; }

  bool loop() const { return loop_; }

  bool test_seek() const { return test_seek_; }

  // --experiment is intended for ad-hoc use when a developer wants to drop in
  // e.g. a repro test. No implementation of it should be submitted, and it
  // should not appear in the usage message.
  bool experiment() const { return experiment_; }

  bool auto_play() const { return play_ || loop_ || test_seek_; }

  const std::vector<std::string>& urls() const { return urls_; }

 private:
  void Usage();

  bool is_valid_;

  std::vector<std::string> urls_;
  bool play_ = false;
  bool loop_ = false;
  bool test_seek_ = false;
  bool experiment_ = false;

  // Disallow copy, assign and move.
  MediaPlayerTestUtilParams(const MediaPlayerTestUtilParams&) = delete;
  MediaPlayerTestUtilParams(MediaPlayerTestUtilParams&&) = delete;
  MediaPlayerTestUtilParams& operator=(const MediaPlayerTestUtilParams&) =
      delete;
  MediaPlayerTestUtilParams& operator=(MediaPlayerTestUtilParams&&) = delete;
};

}  // namespace test
}  // namespace media_player

#endif  // SRC_MEDIA_PLAYBACK_MEDIAPLAYER_TEST_MEDIAPLAYER_TEST_UTIL_PARAMS_H_
