/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

#ifndef _CMDLINE_HXX_
#define _CMDLINE_HXX_

#include "defs.hxx"

//--------------------------------- 
/** Simple command line abstraction
*/

class CommandLine
{
public:

	//################################
	// Creation
	//################################


	CommandLine(size_t argc, char* argv[], const std::string& ArgPrefix = std::string("-"));


	//################################
	// Query
	//################################


	/** Return the argument count
	*/
	size_t get_arg_count() const;

	/** Return an argument by index		
		This method doesn't skip argument
		names if any, so if the second
		argument is an argument name the 
		function nevertheless returns it.

		@precond	0 <= Index < GetArgumentCount

		@throws std::out_of_range exception 
		if the given index is to high
	*/
	std::string get_arg(size_t Index) const;

	/** Returns all argument name found in the 
		command line. An argument will be identified
		by a specified prefix. The standard prefix
		is '-'.
		If there are no argument names the returned 
		container is empty.
	*/
	StringListPtr_t get_arg_names() const;

	/** Returns an argument by name. If there are 
		duplicate argument names in the command line,
		the first one wins.
		Argument name an the argument value must be separated
		by spaces. If the argument value starts with an 
		argument prefix use quotes else the return value is
		an empty string because the value will be interpreted 
		as the next argument name.
		If an argument value contains spaces use quotes. 

		@precond	GetArgumentNames() -> has element ArgumentName

		@throws std::invalid_argument exception 
		if the specified argument could not be 
		found
	*/
	std::string get_arg(const std::string& ArgumentName) const;


	//################################
	// Command
	//################################


	/** Set the prefix used to identify arguments in 
		the command line.

		@precond	prefix is not empty

		@throws std::invalid_argument exception if
		the prefix is empty
	*/
	void set_arg_prefix(const std::string& Prefix);

private:

	/** Returns whether a given argument is an argument name
	*/
	bool is_arg_name(const std::string& Argument) const;

private:
	size_t		m_argc;
	char**		m_argv;
	std::string m_argprefix;

// prevent copy and assignment
private:
	CommandLine(const CommandLine&);
	CommandLine& operator=(const CommandLine&);
};

#endif
