#!/usr/bin/env python

import os,sys,argparse,multiprocessing as mp
SLINGSHOT_N=mp.cpu_count()


commands_with_no_object = ['list', 'status', 'new', 'links', 'configure']
commands_with_corpus_as_only_object = ['info','download','zip','upload','share']


if __name__ == '__main__':
	parser = argparse.ArgumentParser()
	subparsers = parser.add_subparsers(dest='cmd')

	#download_group = subparsers.add_parser('download')
	#download_group.add_argument('corpus',help='Which corpus to download?')

	for cmd in commands_with_no_object:
		group = subparsers.add_parser(cmd)

	for cmd in commands_with_corpus_as_only_object:
		group = subparsers.add_parser(cmd)
		group.add_argument('corpus',help='A corpus, specified by name or ID (in manifest)')

	parser.add_argument('-slingshot',action='store_true',default=False)
	parser.add_argument('-parallel',help='How many parallel processes to run on, using Slingshot?',default=None)
	parser.add_argument('-sbatch',help='Run on sherlock?',action='store_true')
	parser.add_argument('-slingshot_opts',help='Other options to pass to slingshot',default='-progress')
	parser.add_argument('-savedir',help='Directory to save to (if applicable)',default='')
	parser.add_argument('-hours',help='Number of hours to run on Sherlock',default=2)
	parser.add_argument('-quiet',help='No interactive mode',action='store_true')
	args = parser.parse_args()

	if not hasattr(args,'corpus'): args.corpus=None
	if not hasattr(args,'cmd'): args.corpus=None


	if args.parallel: args.slingshot=True

	if args.sbatch and not '-sbatch' in args.slingshot_opts:
		args.slingshot_opts+=' -sbatch'
		args.slingshot_opts= args.slingshot_opts.replace('-progress','')



	## SOLO COMMANDS
	if args.cmd=='list':
		import llp
		manifest=llp.corpus.load_manifest()
		corpus_names=sorted(list(set(manifest.keys())))
		for cname in corpus_names:
			print('>>',cname,'\n'+manifest.get(cname,{}).get('desc','').strip()+'\n')

	elif args.cmd=='status':
		from llp.corpus import check_corpora
		check_corpora()

	elif args.cmd=='links':
		from llp import tools
		print(tools.cloud_list())

	elif args.cmd=='configure':
		import llp
		llp.configure_prompt()


	## COMMANDS ON CORPORA
	if args.cmd=='download' and args.corpus:
		import llp
		corpus = llp.load(args.corpus)
		corpus.download()

	elif args.cmd=='info' and args.corpus:
		import llp
		corpus = llp.load(args.corpus)
		print('['+corpus.name+']')
		for x in sorted(dir(corpus)):
			if x.startswith('path_'):
				v=getattr(corpus,x)
				if v and type(v)==str: print(x,'-->',v,'!' if not os.path.exists(v) else '')


	elif args.cmd=='zip' and args.corpus:
		import llp
		corpus = llp.load(args.corpus)
		ofolder = args.savedir
		sbatch_opts = llp.config['SBATCH_OPTS']+' -t {mins}'.format(mins=60*int(args.hours))
		corpus.zip(savedir=ofolder,sbatch=args.sbatch, sbatch_opts=sbatch_opts, ask=not args.quiet)

	elif args.cmd=='upload' and args.corpus:
		import llp
		corpus = llp.load(args.corpus)
		corpus.upload(ask=not args.quiet)

	elif args.cmd=='share' and args.corpus:
		import llp
		corpus = llp.load(args.corpus)
		corpus.share()

	elif args.corpus and args.cmd in {'save_freqs','save_plain_text','save_metadata'}:
		import llp

		#xargs=list(args[3:])
		xargs=[]
		kwargs={}

		#if args.slingshot:
		kwargs['slingshot']=args.slingshot
		kwargs['slingshot_n']=args.parallel
		kwargs['slingshot_opts']=args.slingshot_opts

		C=llp.load(args.corpus)
		f=getattr(C,args.cmd)
		f(*xargs,**kwargs)

	#else:
	#	import llp
	#	C=llp.load(args.corpus)
	#	f=getattr(C,args.cmd)
	#	f()
