#!/bin/env python
#
import sys, os, traceback, stat, re, getopt, string, inspect
sys.path.append("/hive/data/outside/ncbi/incidentDb/")
import mwclient

def usage():
    sys.stderr.write('''gwUploadFile -- given a file, load into genomewiki as the specified image name
usage:
    gwUploadFile [options] <file.bb> <ImageName>
        load file.bb into genome wiki under image name: Image:ImageName
options:
    -s, --site=genomewiki.ucsc.edu -- use to specify a different site
    -d, --debug  -- show full stack trace on error exits
    -h, --help  -- displays this help message
    -V, --version -- displays version of this program

Note: Using imageName will upper case the first letter to: ImageName
      in the wiki because the wiki does that for names.
Note: requires a .gwLogin file for login name and password to genomewiki
      either in current directory ./.gwLogin or in your HOME/.gwLogin
      A single line file with two words: UserName passWd
      and it must be 600 permissions to keep it secret.\n''')

def loginCredentials():
    # return: loginName, passWd from either ./.gwLogin  or HOME/.gwLogin
    # verify the .gwLogin file has correct restrictive permissions
    home = os.getenv('HOME')
    loginName = "None"
    passWd = "None"
    gwLogin = ".gwLogin"
    try:
	fh = open(gwLogin, 'r')
    except Exception:
	gwLogin = home + "/.gwLogin"
	try:
	    fh = open(gwLogin, 'r')
	except Exception:
	    raise "ERROR: can not read ./.gwLogin or HOME/.gwLogin password file"
    mode = stat.S_IMODE(os.lstat(gwLogin)[stat.ST_MODE])
    for level in "GRP", "OTH":
	for perm in "R", "W", "X":
	    testMode = "S_I"+perm+level
	    if mode & getattr(stat,testMode):
		raise "ERROR: your .gwLogin file must be 600 permissions"
    for line in fh:
	if re.match("#", line):
	    continue
	chomp = line.rstrip('\r\n')
	loginName, passWd = chomp.split()
	break
    fh.close()
    return loginName, passWd

def parseOptions():
    # return: file, pageName, site
    try:
	opts, args = getopt.getopt(sys.argv[1:],
	    'dhs:V', ['debug', 'help', 'version', 'site='])
    except Exception:
	usage()
	raise "ERROR: unrecognized option"
    if len(args) != 2:
	usage()
	raise
    site = 'genomewiki.ucsc.edu'
    sys.tracebacklimit = 0
    for o, a in opts:
	if o in ("-h", "--help"):
	    usage()
	    raise
	elif o in ("-d", "--debug"):
	    sys.tracebacklimit = 10
	    sys.stderr.write('# setting tracebacklimit to 10\n')
	elif o in ("-V", "--version"):
	    sys.stderr.write('# gwUploadFile version 1.0\n')
	elif o in ("-s", "--site"):
	    site = a
	else:
	    assert False, "unrecognized option"
    file = args[0]
    pageName = args[1]
    # force upper case on the first letter since this is what genomewiki
    #	would be doing in any case
    PageName = pageName[0].capitalize() + pageName[1:]
    try:
	fh = open(file, 'r')
    except Exception:
	raise "ERROR: can not read file to upload: '%s'" % (file, )
    fh.close()
    return file, PageName, site

######################################################################
#
######################################################################
try:
    file, pageName, siteUrl = parseOptions()
    loginName, passWd = loginCredentials()
    sys.stderr.write("# loading file: %s\n" % (file, ))
    sys.stderr.write("# into Image name: %s\n" % (pageName, ))
    sys.stderr.write("# login name: %s\n" % (loginName, ))
    sys.stderr.write("# siteUrl: %s\n" % (siteUrl, ))
    sys.stderr.write("# traceBackLimit: %d\n" % (sys.tracebacklimit, ))
    site = mwclient.Site(siteUrl,path='/')
    try:
	site.login(loginName, passWd)
    except Exception:
	sys.stderr.write("ERROR: can not login as user '%s'\n" % (loginName, ))
	raise
    try:
	fh = open(file, 'rb')
    except Exception:
	sys.stderr.write("ERROR: can not read file to upload: '%s'\n" % (file, ))
	raise
    try:
	site.upload(fh, pageName, 'gwUploadFile upload', ignore=True)
    except Exception:
	sys.stderr.write('ERROR: upload returned some kind of error')
	raise
    fh.close()
    # Printing imageusage information
    image = site.Images[pageName]
    sys.stderr.write("# traceBackLimit: %d past site.Images\n" % (sys.tracebacklimit, ))
    sys.stderr.write('Image info: %s\n' % (image.imageinfo, ))
    sys.stderr.write('Image %s usage:\n' % (image.name.encode('utf-8'), ))
    for page in image.imageusage():
	sys.stderr.write('Used: %s; namespace %s\n' % (page.name.encode('utf-8'), page.namespace))
except Exception, ex:
    sys.stderr.write('ERROR: some kind of problem in main\n');
    print ex
    sys.exit(255)
