#!/usr/bin/env python3
import argparse
import os
import sys
from mssh.config import MsshConfig

cnf = MsshConfig().load()


def completions(args):
	try:
		if args.env is None:
			print('\n'.join(cnf.environments.keys()))
			return
		else:
			if args.env not in cnf.environments:
				print('\n'.join([e for e in cnf.environments.keys() if e.startswith(args.env)]))
				return

		if args.product is None:
			print('\n'.join(cnf.environments[args.env].keys()))
			return
		else:
			if args.product not in cnf.environments[args.env]:
				print('\n'.join([e for e in cnf.environments[args.env].keys() if e.startswith(args.product)]))
				return

		if args.server is None:
			print('\n'.join(cnf.environments[args.env][args.product]['servers'].keys()))
			return
		else:
			if args.server not in cnf.environments[args.env][args.product]['servers']:
				print('\n'.join([e for e in cnf.environments[args.env][args.product]['servers'].keys() if e.startswith(args.server)]))
				return
				
		if args.user is None:
			print('\n'.join(cnf.environments[args.env][args.product]['servers'][args.server]['users']))
			return
		else:
			if args.user not in cnf.environments[args.env][args.product]['servers'][args.server]['users']:
				print('\n'.join([e for e in cnf.environments[args.env][args.product]['servers'][args.server]['users'] if e.startswith(args.user)]))
				return
	except KeyError:
		return

def main():
	parser = argparse.ArgumentParser(description='Ssh Hub Command line')
	parser.add_argument('--completions', action='store_true')
	parser.add_argument('env', help='Environment', nargs='?', type=str, default=None)
	parser.add_argument('product', help='Product name', type=str, nargs='?', default=None)
	parser.add_argument('server', help='Server name or alias', nargs='?', type=str, default=None)
	parser.add_argument('user', help='User', type=str, nargs='?', default=None)
	args = parser.parse_args(sys.argv[1:])

	if args.completions:
		completions(args)
	else:

		if not (args.env in cnf.environments):
			print("Environment %s not found" % str(args.env), file=sys.stderr)
			sys.exit(1)
		if args.product is None:
			print("Products in [%s] environment" % args.env)
			for prod in cnf.environments[args.env].keys():
				print(prod)
		else:
			if not (args.product in cnf.environments[args.env]):
				print("Product %s not found" % str(args.product), file=sys.stderr)
				sys.exit(1)
			conn_server = args.server
			if args.server is None:
				if len(cnf.environments[args.env][args.product]['servers']) == 1:
					conn_server = next(iter(cnf.environments[args.env][args.product]['servers'].keys()))
				else:
					print("Servers in [%s] environment on [%s] product" % (args.env, args.product))
					for srv_name, srv in cnf.environments[args.env][args.product]['servers'].items():
						print("Name:%s Host:%s Users:%s" % (srv_name, srv.host, srv.users))
						sys.exit(1)

			if not (conn_server in cnf.environments[args.env][args.product]['servers']):
				print("Server %s not found" % str(args.server), file=sys.stderr)
				sys.exit(1)
			try:
				srv = cnf.environments[args.env][args.product]['servers'][conn_server]
				conn_user = args.user
				if args.user is None and len(srv.users) == 1:
					conn_user = srv.users[0]
				for us in srv['users']:
					if us == args.user:
						conn_user = args.user
						break
				if conn_user is not None:
					cmd = "ssh %s@%s" % (conn_user, srv.host)
					print(cmd)
					os.system(cmd)
				else:
					print("User %s not found" % args.user, file=sys.stderr)
					sys.exit(1)

			except KeyError as e:
				print("Environment %s not found" % str(e), file=sys.stderr)


if __name__ == '__main__':
	main()
