// 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.

#include "garnet/bin/mediaplayer/test/mediaplayer_test_util_params.h"

#include <iostream>
#include "lib/fxl/strings/split_string.h"

namespace media_player {
namespace test {

MediaPlayerTestUtilParams::MediaPlayerTestUtilParams(
    const fxl::CommandLine& command_line) {
  is_valid_ = false;

  play_ = command_line.HasOption("play");
  loop_ = command_line.HasOption("loop");
  test_seek_ = command_line.HasOption("test-seek");
  experiment_ = command_line.HasOption("experiment");

  for (const std::string& arg : command_line.positional_args()) {
    if (arg.compare(0, 1, "/") == 0) {
      std::string url = "file://";
      url.append(arg);
      urls_.push_back(url);
    } else if (arg.compare(0, 7, "http://") == 0 ||
               arg.compare(0, 8, "https://") == 0 ||
               arg.compare(0, 8, "file:///") == 0) {
      urls_.push_back(arg);
    } else {
      Usage();
      std::cerr << "Url-or-path must start with '/' 'http://', 'https://' or "
                   "'file:///'\n";
      return;
    }
  }

  if (urls_.empty()) {
    Usage();
    std::cerr << "Urls/paths required\n";
    return;
  }

  if (urls_.size() > 1 && test_seek_) {
    Usage();
    std::cerr << "--test-seek only works with a single url-or-path\n";
    return;
  }

  if (loop_ && test_seek_) {
    std::cerr << "--loop and --test-seek are mutually exclusive\n";
  }

  is_valid_ = true;
}

void MediaPlayerTestUtilParams::Usage() {
  std::cerr << "mediaplayer_test_util usage:\n";
  std::cerr << "    set_root_view mediaplayer_test_util [ options ] url-or-path*\n";
  std::cerr << "options:\n";
  std::cerr << "    --play       play on startup\n";
  std::cerr << "    --loop       play the files in a loop on startup\n";
  std::cerr << "    --test-seek  play random segments of one file on startup\n";
  // --experiment is deliberately omitted here. See the .h file.
}

}  // namespace test
}  // namespace media_player
