#!/usr/bin/python

import sys
import os
import datetime
#dir = os.path.dirname(os.path.abspath(__file__))
dir = os.path.dirname(__file__)
#print "dir = %s" % dir

library = os.path.join(dir,"../../lib")
#print library



sys.path.append(library)
#sys.path.append('/cluster/home/wong/kent/python/lib/')

from ucscgenomics.rafile.RaFile import *

def indexOldAssembly(rafile):
	objList = {}
	oldAssmRaFile = RaFile(rafile)
	oldestDateSub = 0
	oldestObjSub = ""
	newestDateSub = 0
	newestObjSub = ""
	oldestDateUn = 0
	oldestObjUn = ""
	newestDateUn = 0
	newestObjUn = ""
	#structure is oldAssmExpIds[expIdviewreplicate] = information dict
	#used for easy lookup of an equivalent hg18 object, it will only run through the list of expids first instead of all objects looking for a match
	oldAssmExpIds = {}
	
	for key in oldAssmRaFile.keys():
		stanza = oldAssmRaFile[key]
		if 'dateSubmitted' not in stanza:
			print "%s has no dateSubmitted" % (stanza['metaObject'])
			continue
		if not ('replicate' in stanza):
			stanza['replicate'] = "NA"
			#print "hg18:%s" % (stanza['metaObject'])
		if 'expId' in stanza:
			info = {}
			info['replicate'] = stanza['replicate']
			info['dateSubmitted'] = stanza['dateSubmitted']
			info['dateUnrestricted'] = stanza['dateUnrestricted']
			info['metaObject'] = stanza['metaObject']
			expid = stanza['expId']
			rep = stanza['replicate']
			objView = stanza['view']
			key = "%s%s%s" % (expid, rep, objView)
			if 'dateResubmitted' in stanza:
				info['dateResubmitted'] = stanza['dateResubmitted']
			if not oldestDateUn:
				oldestDateUn = stanza['dateUnrestricted']
				newestDateUn = stanza['dateUnrestricted']
				oldestObjUn = stanza['metaObject']
				newestObjUn = stanza['metaObject']
			if stanza['dateUnrestricted'] < oldestDateUn:
				oldestDateUn = stanza['dateUnrestricted']
				oldestObjUn = stanza['metaObject']
			if stanza['dateUnrestricted'] > newestDateUn:
				newestDateUn = stanza['dateUnrestricted']
				newestObjUn = stanza['metaObject']
			if not oldestDateSub:
                                oldestDateSub = stanza['dateSubmitted']
                                newestDateSub = stanza['dateSubmitted']
				oldestObjSub = stanza['metaObject']
                                newestObjSub = stanza['metaObject']
                        if stanza['dateUnrestricted'] < oldestDateSub:
                                oldestDateSub = stanza['dateSubmitted']
				oldestObjSub = stanza['metaObject']
                        if stanza['dateUnrestricted'] > newestDateSub:
                                newestDateSub = stanza['dateSubmitted']
				newestObjSub = stanza['metaObject']


			oldAssmExpIds[key] = info
		localdateun = calculateDateUn(stanza['dateSubmitted'])
        	if localdateun == stanza['dateUnrestricted'] or stanza['dateUnrestricted'] == minusOneDay(localdateun):
			pass
		else:
			print "%s: dateSubmitted = %s, calculated dateUnrestricted = %s, real dateUnrestricted = %s" % (stanza['metaObject'], stanza['dateSubmitted'], localdateun, stanza['dateUnrestricted'])
	print "DateSubmitted range in old assembly: %s %s to %s %s" % (oldestObjSub, oldestDateSub, newestObjSub, newestDateSub)
	print "DateUnrestricted range in old assembly: %s %s to %s %s" % (oldestObjUn, oldestDateUn, newestObjUn, newestDateUn)

	
	return(oldAssmExpIds)

def dayInMon(mon, year):
	if mon == 02:
		if (not (year % 4)) and (year % 100) or (not (year % 400)):
			return 29
		else:
			return 28
	elif mon == 4 or mon == 6 or mon == 9 or mon == 11:
		return 30
	else:
		return 31

def calculateDateUn(dateIn):
	splitdate = dateIn.split("-")
	mon = int(splitdate[1])
	day = int(splitdate[2])
	year = int(splitdate[0])
	restday = day
	restyear = year
	restmon = mon + 9
	if restmon > 12:
		restyear = year + 1
		restmon = (mon + 9) % 12
	daymon = dayInMon(restmon, restyear)
	if day > daymon:
		restmon = restmon + 1
		restday = daymon
	returnstr = "%02d-%02d-%02d" % (restyear, restmon, restday)
	return(str(returnstr))	

def minusOneDay(dateIn):

	splitdate = dateIn.split("-")
	mon = int(splitdate[1])
        day = int(splitdate[2])
        year = int(splitdate[0])
	newday = day - 1
	newmon = mon
	if newday == 0:
		newmon = mon - 1
		newday = dayInMon(newmon, year)
	returnstr = "%02d-%02d-%02d" % (year, newmon, newday)
	return(str(returnstr))

def getNewAssemblyObjects(rafile):
	ra = RaFile(rafile)
	objList = {}
	for key in ra.keys():
		stanza = ra[key]
		#print "stanza = %s" % stanza
		objInfo = {}
		if not ('replicate' in stanza):
			stanza['replicate'] = "NA"
			#print "hg19:%s" % (stanza['metaObject'])
		if 'expId' in stanza:
			objInfo['expId'] = stanza['expId']
			objInfo['view'] = stanza['view']
			objInfo['replicate'] = stanza['replicate']
			if 'dateUnrestricted' in stanza:
				#print "here2";
				objInfo['dateUnrestricted'] = stanza['dateUnrestricted']
			#if 'dateSubmitted' in stanza:
				objInfo['dateSubmitted'] = stanza['dateSubmitted']
				#localdateun = calculateDateUn(stanza['dateSubmitted'])
				#print "dateSubmitted = %s, calculated dateUnrestricted = %s, real dateUnrestricted = %s" (stanza['dateSubmitted'], localdateun, stanza['dateUnrestricted'])
			#else:
			#	sys.stdout.write("missing dateSubmitted in object %s" % stanza['metaObject']
			if 'dateResubmitted' in stanza:
				objInfo['dateUnrestricted'] = stanza['dateSubmitted']
			objList[stanza['metaObject']] = objInfo
	return(objList)



def main():

	if len(sys.argv) != 3:
		arglen = len(sys.argv)
		#print arglen
		sys.exit("usage: dateCheck.py newAssemblyTrackDb.ra oldAssemblyTrackDb.ra")
		#sys.exit()
			
	
	oldAssmExpIds = indexOldAssembly(sys.argv[2])
	newAssmObjects = getNewAssemblyObjects(sys.argv[1])
	date = datetime.date
	today = str(date.today())
	#print today	

	for key in newAssmObjects.keys():
		expid = newAssmObjects[key]['expId']
		rep = newAssmObjects[key]['replicate']
		view = newAssmObjects[key]['view']
		key2 = "%s%s%s" % (expid, rep, view)
		#print "key2 = %s" % (key2)
		if key2 in oldAssmExpIds:
			infoDict = oldAssmExpIds[key2]
			setVars = ""
			vars = ""
			if 'dateResubmitted' in newAssmObjects[key] and 'dateResubmitted' in infodict:
				print "New Assembly already has dateResubmitted for object %s, old assembly object %s" % (key, infodict['metaObject']) 
			if infoDict['dateSubmitted'] < newAssmObjects[key]['dateSubmitted']:
				#print "\n"
				#print "%s vs %s, dateSubmitted: %s vs %s" % (key, infoDict['metaObject'], infoDict['dateSubmitted'], newAssmObjects[key]['dateSubmitted'])
				setVars = "dateSubmitted=%s dateResubmitted=%s" % (infoDict['dateSubmitted'], newAssmObjects[key]['dateSubmitted'])
				
			if infoDict['dateUnrestricted'] < newAssmObjects[key]['dateUnrestricted']:
				#print "%s vs %s, dateUnrestricted: %s vs %s" % (key, infoDict['metaObject'], infoDict['dateUnrestricted'], newAssmObjects[key]['dateUnrestricted'])	
				setVars = "%s dateUnrestricted=%s" % (setVars, infoDict['dateUnrestricted'])

			if setVars:
				if rep == "NA":
					vars = "expId=%s view=%s" % (expid, view)
				else:
					vars = "expId=%s view=%s replicate=%s" % (expid, view, rep)
				sys.stderr.write("mdbUpdate hg19 -vars=\"%s\" -setVars=\"%s\"\n" % (vars, setVars))				

if __name__ ==  "__main__":
	main()
