#!/usr/bin/python

import argparse
import grp
import hubzero.utilities.user
import hubzero.config.webconfig
import re
import traceback

# parse the command line
parser = argparse.ArgumentParser()
parser.add_argument("username", help="username, alpha username")
parser.add_argument("firstname", help="first name, alpha only")
parser.add_argument("lastname", help="last name, alpha only")
parser.add_argument("email", help="email address")
parser.add_argument("--joomlagid", help="Joomla specific GIDs, (18=Registered, 23=Manager, 24=Administrator, 25=Super Administrator)")
parser.add_argument("--gid", help="Linux GIDs, see /etc/group file for list (default: 3000/public")
args = parser.parse_args()

# really, python has no int test without having to throw an exception?
def RepresentsInt(s):
	try: 
		int(s)
		return True
	except ValueError:
		return False


# username tests
args.username = args.username.lower()
p = re.compile("[a-z][a-z0-9]*")
m = p.match(args.username)
if not m:
	print "username invalid - must be alphanumeric and must start with letter"
	exit(1)

# fname/lname tests
if not args.firstname.isalpha() or not args.lastname.isalpha:	
	print "firstname/lastname invalid - must be alpha only"
	exit(2)

# joomlagid tests
userTypeLookupDict = {18:"Registered", 23:"Manager", 24:"Administrator", 25:"Super Administrator"}

if RepresentsInt(args.joomlagid):
	if not args.joomlagid in ['18', '23', '24', '25']:
		print "invalid joomlagid (1) " + args.joomlagid
		exit(3)
	else:
		jgidNumber = args.joomlagid
		jgid = userTypeLookupDict[int(args.joomlagid)]

else:
	if not args.joomlagid in ["Registered", "Manager", "Administrator", "Super Administrator"]:
		print "invalid joomlagid (2) " + args.joomlagid
		exit(3)
	else:
		jgid = [key for key,val in userTypeLookupDict.items() if val==args.joomlagid ][0]
		jgidNumber = args.joomlagid

	
# gid tests
try:
	if not args.gid.isdigit():
		if not grp.getgrnam(args.gid):
			print "invalid gid"
			exit(3)
		else:
			gid = args.gid
			gidNumber = grp.getgrnam(args.gid)[2]
	else:
		if not grp.getgrgid(args.gid):
			print "invalid gid"
			exit(3)
		else:
			gid = grp.getgrgid(args.gid)[0]
			gidNumber = args.gid
except Exception as e:
	traceback.print_exc()
	print "Error: problem with provided gid"
	raise e
	

# email validity testing
p = re.compile("^[a-zA-Z0-9.]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$")
m = p.match(args.email)
if not m:
	print "invalid email"
	exit(4)


hubzero.utilities.user.addhubuser(args.username, args.firstname, args.lastname, args.email, jgid, jgidNumber, gid, gidNumber)


exit(0)