/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_TOOLS_SIMPLE_COMMAND_LINE_PARSER_H_
#define WEBRTC_TOOLS_SIMPLE_COMMAND_LINE_PARSER_H_

#include <map>
#include <string>
#include <vector>

#include "webrtc/system_wrappers/interface/constructor_magic.h"
#include "webrtc/test/testsupport/gtest_prod_util.h"

// This is a very basic command line parsing class. We pass the command line
// arguments and their number and the class forms a vector out of these. Than we
// should set up the flags - we provide a name and a string value and map these.
//
// Example use of this class:
// 1. Create a CommandLineParser object.
// 2. Configure the flags you want to support with SetFlag calls.
// 3. Call Init with your program's argc+argv parameters.
// 4. Parse the flags by calling ProcessFlags.
// 5. Get the values of the flags using GetFlag.

namespace webrtc {
namespace test {

class CommandLineParser {
 public:
  CommandLineParser() {}
  ~CommandLineParser() {}

  void Init(int argc, char** argv);

  // Prints the entered flags and their values (without --help).
  void PrintEnteredFlags();

  // Processes the vector of command line arguments and puts the value of each
  // flag in the corresponding map entry for this flag's name. We don't process
  // flags which haven't been defined in the map.
  void ProcessFlags();

  // Sets the usage message to be shown if we pass --help.
  void SetUsageMessage(std::string usage_message);

  // prints the usage message.
  void PrintUsageMessage();

  // Set a flag into the map of flag names/values.
  // To set a boolean flag, use "false" as the default flag value.
  // The flag_name should not include the -- prefix.
  void SetFlag(std::string flag_name, std::string default_flag_value);

  // Gets a flag when provided a flag name (name is without the -- prefix).
  // Returns "" if the flag is unknown and "true"/"false" if the flag is a
  // boolean flag.
  std::string GetFlag(std::string flag_name);

 private:
  // The vector of passed command line arguments.
  std::vector<std::string> args_;
  // The map of the flag names/values.
  std::map<std::string, std::string> flags_;
  // The usage message.
  std::string usage_message_;

  // Returns whether the passed flag is standalone or not. By standalone we
  // understand e.g. --standalone (in contrast to --non_standalone=1).
  bool IsStandaloneFlag(std::string flag);

  // Checks whether the flag is in the format --flag_name=flag_value.
  // or just --flag_name.
  bool IsFlagWellFormed(std::string flag);

  // Extracts the flag name from the flag, i.e. return foo for --foo=bar.
  std::string GetCommandLineFlagName(std::string flag);

  // Extracts the flag value from the flag, i.e. return bar for --foo=bar.
  // If the flag has no value (i.e. no equals sign) an empty string is returned.
  std::string GetCommandLineFlagValue(std::string flag);

  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, IsStandaloneFlag);
  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, IsFlagWellFormed);
  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, GetCommandLineFlagName);
  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, GetCommandLineFlagValue);

  DISALLOW_COPY_AND_ASSIGN(CommandLineParser);
};

}  // namespace test
}  // namespace webrtc

#endif  // WEBRTC_TOOLS_SIMPLE_COMMAND_LINE_PARSER_H_
