""" Utility module handle program args and give help

	--------------------------------------------------------------------------
	File: 			utilsArgsParse.py

	Overview: 		Python module to parse and validate program parameters
					against those required by the program whether mandatory
					or optional.
					Also give help information on arguments required by the
					program.
									
	Gotchas:		None.

	Copyright:		None.
	--------------------------------------------------------------------------
	
"""

# Python modules:
import sys		# Provide argument parsing
import getopt	# Parse command line arguments

# Third party modules:

# In-house modules:
import utilsOsType	# Determine the OS type this script is running on

# Instantiations:

# User facing text:
strMsgErrorInvalidParameters = "Invalid parameters entered, -h for help. \nYou entered:\n";
strMsgErrorInvalidNoParams = "No parameters entered, -h for help\n";
strMsgErrorNumberParameters = "Number of parameters entered incorrect, %d parameters required. You entered:\n";
strMsgArgFileNotImplemented = "Sorry the --argFile is not implemented";

#++---------------------------------------------------------------------------
# Details:	Validate the arguments passed in against the mandatory and
#			optional arguments specified. The argument format for the parameters
#			is required to work with the module getopt function getopt().
#			Parameter vDictArgReq specifies which parameters are mandatory and
#			which are optional. The format is for example:
#				dictArgReq = {	"-h": "o",	# o = optional, m = mandatory
#								"-m": "m",
#								"--targetDir": "m",
#								"--cfgBldDir": "o" };
# Args:		vArgv			- (R) List of arguments and values.
#			vstrListArgs	- (R) List of small arguments.
#			vListLongArgs	- (R) List of long arguments.
#			vDictArgReq		- (R) Map of arguments required.
#			vstrHelpInfo	- (R) Formatted help text.
# Returns:	Int		- 0 success.
#					  1 success display information, do nothing else.
#					  -1 error invalid parameters.
#					  -2 error incorrect number of mandatory parameters.
#			Dict 	- Map of arguments names to argument values
#			Str		- Error message. 
# Throws:	None.
#--
def parse( vArgv, vstrListArgs, vListLongArgs, vDictArgReq, vstrHelpInfo ):
	dictArgs = {};
	dictDummy = {};
	strDummy = "";
			
	# Validate parameters above and error on not recognised
	try:
		dictOptsNeeded, dictArgsLeftOver = getopt.getopt( vArgv,
														  vstrListArgs, 
														  vListLongArgs );
	except getopt.GetoptError:
		strMsg = strMsgErrorInvalidParameters;
		strMsg += str( vArgv );
		return (-1, dictDummy, strMsg);

	if len( dictOptsNeeded ) == 0:
		strMsg = strMsgErrorInvalidNoParams;
		return (-1, dictDummy, strMsg);
		
	# Look for help -h before anything else
	for opt, arg in dictOptsNeeded:
		if opt == '-h':
			return (1, dictDummy, vstrHelpInfo );
		
	# Look for the --argFile if found ignore other command line arguments
	for opt, arg in dictOptsNeeded:
		if opt == '--argsFile':
			return (1, dictDummy, strMsgArgFileNotImplemented);
	
	# Count the number of mandatory args required (if any one found)
	countMandatory = 0;
	for opt, man in vDictArgReq.iteritems():
		if man == "m":
		  countMandatory = countMandatory + 1;
	
	# Extract short args
	listArgs = [];
	for arg in vstrListArgs:
		if (arg == '-h') or (arg == ':'):
			continue;
		listArgs.append( arg );
	
	# Append to arg dictionary the option and its value
	bFoundNoInputValue = False;
	countMandatoryOpts = 0;
	for opt, val in dictOptsNeeded:
		match = 0;
		for arg in listArgs:
			argg = "-" + arg;
			if opt == argg:
				if "m" == vDictArgReq[ opt ]:
					countMandatoryOpts = countMandatoryOpts + 1;
				dictArgs[ opt ] = val;
				match = 1;
				break;
		if match == 0:
			for arg in vListLongArgs:
				argg = "--" + arg[:arg.__len__() - 1];
				if opt == argg:
					if "m" == vDictArgReq[ opt ]:
						countMandatoryOpts = countMandatoryOpts + 1;
					dictArgs[ opt ] = val;
					if val.__len__() == 0:
						bFoundNoInputValue = True;	
					break;
	
	# Do any of the long arguments not have a value attached
	if bFoundNoInputValue:
		strMsg = strMsgErrorInvalidParameters;
		strMsg += str( vArgv );
		return (-1, dictDummy, strMsg);

	# Debug only
	#print countMandatoryOpts
	#print countMandatory
	
	# Do we have the exact number of mandatory arguments
	if (countMandatoryOpts > 0) and (countMandatory != countMandatoryOpts):
		strMsg = strMsgErrorNumberParameters % countMandatory;
		strMsg += str( vArgv );
		return (-2, dictDummy, strMsg);

	return (0, dictArgs, strDummy);
