import pprint, time
Logger = system.util.getLogger("alarm.summary")
provider = "[default]"

def initAlarmSummaries():
	""" This function will reset all the alarm summary udt's in the system
		
	"""
	allActiveAlarmsTag = []
	newValues = []
	for t in system.tag.browse(provider,  {"tagType":"UdtInstance", "typeId": "AlarmSummary", "recursive":True}):
		allActiveAlarmsTag.append(t["fullPath"].toString() +"/ActiveAlarms")
		newValues.append({})
	
	system.tag.writeAsync(allActiveAlarmsTag, newValues)
		
def updateAlarmCount(srcPath, priority, state):
	pass
	

def calcMaxPriority(levelPath):
	""" Pass in the path level to determine the max priority and return the value
		levelPath: string of the object level path without the /AlarmSummary/ActiveAlarms
	"""
	aggAlarmStatus = system.tag.readBlocking([levelPath+"/AlarmSummary/ActiveAlarms"])[0].value.toDict()
	
	return determinePriority(aggAlarmStatus)
			
def determinePriority(tagValue):
	""" Use this method to figure out the highest priority level of a tag. Useful with transforms from front-end
		Args:
			tagValue: dict/document of the expected structure of {srcPath:priority}
		Returns:
			maxState: int -1 for none, 0-Diag, 1-Low, 2- Med, 3- High, 4-Critical
	"""
	maxState = -1
	for k, v in tagValue.iteritems():
		maxState = v if v > maxState else maxState
	
	return maxState

	
	
def syncAlarms():
	"""
		Timer based function to update all of the aggregate alarm tags.
	
	"""
	sublog = Logger.createSubLogger("syncAlarms")
	start = time.time()
	levelAlarmSummary = {} #{"alarmPath":[{srcAlarm:priority}]
	for alm in system.alarm.queryStatus(priority=[0,1,2,3,4],state=['ActiveUnacked','ActiveAcked']):
		srcPath = alm.getSource().toString()
		mainTagPath = srcPath.split("/tag:")[1].split(":/alm")[0]
		priorityVal = alm.getPriority().intValue
		
		pathLevelsList = mainTagPath.split("/")		
		
		# Because alarms can exist outside of the /Alarms folder in the UDT, we will account for this
		almOffset = -1
		if "Alarms" not in pathLevelsList:
			almOffset= 0

		for i in range(1, len(pathLevelsList) + almOffset):
			path = provider+"/".join(pathLevelsList[:i])+"/AlarmSummary/ActiveAlarms"
			if path not in levelAlarmSummary.keys():
				levelAlarmSummary[path]= {}
	
			levelAlarmSummary[path][srcPath] = max([levelAlarmSummary[path].get(srcPath,0), priorityVal ])
			
#	pprint.pprint(levelAlarmSummary)
	writeTags, writeVals = [], []
	for k, v in levelAlarmSummary.iteritems():
		writeTags.append(str(k))
		writeVals.append(v)
	sublog.debug("%s - %s"%(writeTags, writeVals))
	if len(writeTags) == len(writeVals) and len(writeTags) > 0:
		system.tag.writeAsync(writeTags, writeVals)


	sublog.trace("finished in %s sec"%(time.time() - start))