from datetime import datetime
def getBaseTagPaths(collection, location=None):
	if location is not None:
		return collection[location]
	else:
#		return [x for v in collection.values() for x in v]
		return [value for key, values in collection.items() if key in ["Common","DH1","DH2","DH3","DH4","DH5"] for value in values]
		

def getHistory(paths, startDate, endDate, customArgs={}):
	"""
		Generic get history
		Args:
			paths: [] of strings/tagpaths
			startDate: date start of range
			endDate: date end of range
			customArgs: dictionary of custom values if needed
		returns:
			PyDataSet
	"""
	intervalMin = customArgs.get("intervalMinutes",1)
	noInterpol = customArgs.get("noInterpolation",True)
	ignoreBad = customArgs.get("ignoreBadQuality",True) 
	aggMode = customArgs.get("aggregationMode","LastValue")
	
	histDS = system.tag.queryTagHistory(paths, startDate, endDate, aggregationMode = aggMode, intervalMinutes= intervalMin,noInterpolation= noInterpol, ignoreBadQuality= ignoreBad )
#	print "common.util.getHist", histDS.getRowCount(), paths
	return system.dataset.toPyDataSet(histDS)
		

def generateSumCol(hist, sumColName="SumRealPwr"):
	allHeaders = system.dataset.getColumnHeaders(hist)
	
	sumCol = []
	for row in hist:
		try:
			sumCol.append(sum([row[h] for h in allHeaders[1:] if row[h] is not None]) if len(allHeaders)>1 else 0) 
		except:
			sumCol.append(0)
		
	return system.dataset.toPyDataSet(system.dataset.addColumn(hist, sumCol, sumColName, float))
	
def averageIntervalData(histDS, interval=15):
	"""
		Average values over time based on minute per minute data.
		First column should be t_stamp
	"""
	timeUnitStr = ""
	GroupDict= {} # represents {"datetime":{"col1":[], "col2":[]...}}
	histDsCols = system.dataset.getColumnHeaders(histDS)[1:]
	resultData = []
	for i,row in enumerate(histDS):
		if i%interval == 0: 
			timeUnitStr = system.date.format(row["t_stamp"],"yyyy-MM-dd HH:mm")
			GroupDict.setdefault(timeUnitStr, {})
			GroupDict[timeUnitStr]={col:[] for col in histDsCols}
#		GroupDict[quarterHrStr].append(row["SumRealPwr"])
		for col in histDsCols:
			GroupDict[timeUnitStr][col].append(row[col] if row[col] is not None else 0)
	sortedDateKeys = sorted(GroupDict.keys(), key=lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M'))
	for dt_str in sortedDateKeys:		
		oneRow = [system.date.parse(dt_str, "yyyy-MM-dd HH:mm")]+ [sum(GroupDict[dt_str][col])/len(GroupDict[dt_str][col]) for col in histDsCols]
		resultData.append(oneRow)
	
	return system.dataset.toPyDataSet(system.dataset.toDataSet(["t_stamp"]+histDsCols, resultData))


def mergeHistorianData(ds1, ds2):
	"""
		Expects 2 sets of historian data, sanity check . t_stamp should be column index 0, so we only need one
	"""
	if len(ds1) != len(ds2):
		raise Exception("Mismatch on both datasets")
	else:
		ds1Header = system.dataset.getColumnHeaders(ds1)
		ds2Header = system.dataset.getColumnHeaders(ds2)[1:]
		
		newHeader = ds1Header+ds2Header
		
		allRows = []
		for i,row in enumerate(ds1):
			newRow = [c for c in row] + ([c for c in ds2[i]][1:])
			allRows.append(newRow)
#		print len(newHeader), len(allRows[0])	
		return system.dataset.toPyDataSet(system.dataset.toDataSet(newHeader, allRows))
	
	