""" 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 list(vDictArgReq.items()):
		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);
