#!/usr/bin/python


import os,sys


def docSortOrder(docType):
	if docType.find('Script') != -1:	return 10;
	if docType.find('Info') != -1: 		return 20;
	if docType.find('Übung') != -1: 	return 30;
	if docType.find('Rechen') != -1: 	return 40;
	if docType.find('Text') != -1: 		return 50;
	if docType.find('Dokument') != -1:	return 60;

def versionSortByYear(version):
	year=version[version.find('_')+1:-4]
	if year.find('_') != -1:
		addInfo=year[year.find('_')+1:]
		year=year[0:year.find('_')]
	if len(year) == 4:
		return float(year)*1000
	if len(year) == 5:
		return float(year)*1000+ord(year[4])
	return -1
	
def altVersionSortByYear(version):
	version=version[0:version.rfind('_')]+version[version.rfind('.'):]
	return versionSortByYear(version)


def writeTopicFull(topic,indexFile):
	indexFile.write('<u><b>'+topic+'</b></u><br>\n<ul>\n')
	
def writeTopicCurrent(topic,indexFile):
	indexFile.write('  <li>\n    <u>'+topic+'</u><br>\n')
	
	
	
def writeDocItem(docType,title,indexFileFull,indexFileCurrent):
	if docSortOrder(docType)==10: docType='Script';
	if docSortOrder(docType)==20: docType='Info';
	if docSortOrder(docType)==30: docType='Übungsaufgaben';
	if docSortOrder(docType)==40: docType='Rechenaufgaben';
	if docSortOrder(docType)==50: docType='Textaufgaben';
	if docSortOrder(docType)==60: docType='Dokument';
	indexFileFull.write('  <li>\n    <u>'+docType+': '+title+'</u><br>\n')
	indexFileCurrent.write('    '+docType+': '+title+' ')	

	
	

def makeLinkToDoc(docType,title,version):
	fakultasDir=os.path.abspath(os.getcwd()+'/..')
	fakultasDir=fakultasDir[fakultasDir.rindex('/'):]
	#print(fakultasDir)
	sectionDir=os.path.abspath(os.getcwd())
	sectionDir=sectionDir[sectionDir.rindex('/'):]
	#print(sectionDir)
	#sys.exit()
	return '<a href="/Documents'+fakultasDir+sectionDir+docType[1:]+'/'+title+'/'+version+'" target="_blank">'+version+'</a>'
	
def getMainVersions(versions):
	mainVersions=list()
	for iVersion in versions:
		if iVersion.count('_')==1:
			mainVersions.append(iVersion)
	mainVersions.sort(key=versionSortByYear, reverse=True)
	return mainVersions
	
def getAlternativeVersions(versions):
	alternativeVersions={}
	for iVersion in versions:
		if iVersion.count('_')>1:
			altType=iVersion[iVersion.rfind('_')+1:iVersion.rfind('.')]
			if altType in alternativeVersions:
				alternativeVersions[altType].append(iVersion)
			else:
				alternativeVersions[altType]=[iVersion]
	print(alternativeVersions)
	return alternativeVersions
	
def getCustomParentInfo(docType,title):
	parentInfo='---'
	if os.path.exists(iDocType+'/'+iTitle+'/Quellen/parent.txt'):
		parentFile = open(iDocType+'/'+iTitle+'/Quellen/parent.txt', 'r')
		parentInfo = parentFile.read()
		parentFile.close()
	return parentInfo
	
def writeVersions(docType,title,versions,indexFileFull,indexFileCurrent):
	mainVersions=getMainVersions(versions)
	alternativeVersions=getAlternativeVersions(versions)
	if mainVersions:
		indexFileFull.write('    Aktuelle Version: '+makeLinkToDoc(docType,title,mainVersions[0])+'<br>\n')
		indexFileCurrent.write(makeLinkToDoc(docType,title,mainVersions.pop(0))+'<br>\n')
	else:
		indexFileFull.write('    Aktuelle Version nicht verfügbar')
		indexFileCurrent.write('(Aktuelle Version nicht verfügbar)<br>\n')
	
	indexFileFull.write('    Vorherige Version: ')
	parentInfo=getCustomParentInfo(docType,title)
	if mainVersions and parentInfo=='---':
		parentInfo=''
	while mainVersions:
		indexFileFull.write(makeLinkToDoc(docType,title,mainVersions.pop(0)))
		if mainVersions:
			indexFileFull.write(' ; ')
	indexFileFull.write(parentInfo+'<br>\n')
	
	if len(alternativeVersions)>0:
		for iAlternative in list(alternativeVersions.keys()):
			print(iAlternative)
			print(alternativeVersions[iAlternative])
			alternativeVersions[iAlternative].sort(key=altVersionSortByYear, reverse=True)
			print(alternativeVersions[iAlternative])
			indexFileFull.write('    Alternative Version ('+iAlternative+'): ')
			while alternativeVersions[iAlternative]:
				indexFileFull.write(makeLinkToDoc(docType,title,alternativeVersions[iAlternative].pop(0)))
				if alternativeVersions[iAlternative]:
					indexFileFull.write(' ; ')
			indexFileFull.write(parentInfo+'<br>\n')



#######################################################################
# M A I N
#######################################################################

fullIndexFile = open('./fullIndex.php', 'w')
currentIndexFile = open('./currentIndex.php', 'w')
currentIndexFile.write('<ul>\n')

#Liste der Hauptthemengebiete erstellen
topicsFile = open('./Themenliste.txt', 'r')
topicsList = topicsFile.readlines()
topicsFile.close()
for i in range(len(topicsList)): #Zeilenumbruch entfernen
	topicsList[i]=topicsList[i].strip()


#Jedes Themengebiet durchlaufen
for iTopic in topicsList:
	writeTopicFull(iTopic,fullIndexFile)
	writeTopicCurrent(iTopic,currentIndexFile)
	#Liste der zur Verfügung stehenden Dokumenttypen für dieses Themengebiet erstellen
	docTypesList=list()
	folderContent = os.scandir('./'+iTopic)
	for iContent in folderContent: #Nur Ordner, Dateien ignorieren
		if iContent.is_dir():
			docTypesList.append(iContent.path)
    #Liste der Dokumenttypen in der gewünschten Reihenfolge sortieren     
	docTypesList.sort(key=docSortOrder)

	#In diesem Themengebiet alle Dokumenttypen durchlaufen
	for iDocType in docTypesList:
		#Liste der zur Verfügung stehenden Dokumente erstellen
		titlesFile = open(iDocType+'/Dokumentenliste.txt', 'r')
		titlesList = titlesFile.readlines()
		titlesFile.close()
		for i in range(len(titlesList)): #Zeilenumbruch entfernen
			titlesList[i]=titlesList[i].strip()
		
		
		for iTitle in titlesList:
			writeDocItem(iDocType,iTitle,fullIndexFile,currentIndexFile)
			docVersionList=list()
			folderContent = os.scandir(iDocType+'/'+iTitle)
			for iContent in folderContent: #Nur Dateien, Ordner ignorieren
				if iContent.is_file():
					docVersionList.append(iContent.name)
			writeVersions(iDocType,iTitle,docVersionList,fullIndexFile,currentIndexFile)
	fullIndexFile.write('</ul>\n\n')
	currentIndexFile.write('  </li>\n')
	
currentIndexFile.write('</ul>\n\n')
fullIndexFile.close()
currentIndexFile.close()
