#!/usr/bin/python

#2020-02 fp@bbw

# Dieses Programm sucht alle Pruefungen und Pruefungsfragen durch
# und erstellt den Index: Welche Pruefungsfrage in welcher Pruefung vorkommt.
# Die Pruefungsfragen werden nach Kapitel sortiert und es wird eine LaTeX-Datei
# erstellt.

import os; # Opreating System
import re;

skriptPath=os.path.dirname(os.path.realpath(__file__));
pruefungsAufgabenPath='../pruefungen/aufgaben';

tempListe=[];
def print_tex_directory_contents(sPath):
	tempListe=[];
	return print_tex_directory_contents_recursive(sPath);


def print_tex_directory_contents_recursive(sPath):
	for sChild in os.listdir(sPath):
		sChildPath = os.path.join(sPath,sChild);
		if os.path.isdir(sChildPath):
			print_tex_directory_contents_recursive(sChildPath);
		else:
			if sChildPath.strip().endswith('.tex'):
				tempListe.append(sChildPath);
	return tempListe;


#   Woher werden die Pruefungen geholt?
os.chdir("..");
pruefungsListe = print_tex_directory_contents(".");
tempListe=[];

print ('PruefungsListe...');
#print(pruefungsListe);

prfgDict={}; # Alle Prffungen als Dict

for pruefungsFilePath in pruefungsListe:
#	print pruefungsFilePath;
	tmp_pruefungsFile = open(pruefungsFilePath, "rt");
	for line in tmp_pruefungsFile.readlines():
		if line.startswith("\\input{P_"):
			print (pruefungsFilePath, "-->", line);
			m = re.search('./(.+?)/Pruefung', pruefungsFilePath)
			if m:
				found = m.group(1);
#				print found , "===>", line.strip();
				n = re.search('\\\\input{(.+?)}.*', line);
				if n:
					found2 = n.group(1);
					#print found , "***", found2;
					if not found in prfgDict.keys():
						prfgDict[found] = [];
					prfgDict[found].append(found2);

# print prfgDict;


pruefungsFragenListeStriped = [];

## Woher werden die Pruefungsaufgaben geholt?
os.chdir(pruefungsAufgabenPath);


pruefungsFragenListe = print_tex_directory_contents('.');
for frage in pruefungsFragenListe:
	m = re.search('./(.+?)\.tex$', frage); ## $ eingefuegt, denn das .tex gilt nur am Zeilenende
	found = m.group(1)
	pruefungsFragenListeStriped.append(found);


#skriptPath=os.path.dirname(os.path.realpath(__file__));
os.chdir(skriptPath);


##
## Abkuerzungen wie _n1_ in "Niveau 1" ersetzen.
## Dafuer wird die folgende Erestzungsliste erstellt.
##
textErsetzungsListe = {};
ersetzFile = open('fileNameReplacements.txt', 'rt');
for line in ersetzFile.readlines():
	aaa, bbb = line.split('=', 1);
	textErsetzungsListe[aaa] = " " + bbb + " \\\\\n ";

#print textErsetzungsListe;


##
## Ersetze _ durch \_ fuer LaTeX
def lesbar(text):
	return text.replace('_', '\_') ;


## Sonderzeichen in Filenamen ersetzen,
## um Verwechslungen und Probleme im LaTeX zu verhindern:
def ersetzeAlle(text):
	for leftText in textErsetzungsListe.keys():
		rightText = textErsetzungsListe[leftText];
		text = text.replace(leftText, rightText.strip());
	text=text.replace('_', ' ');
	text=text.replace('/', '');
	return text;


## LaTeX generieren
def alleFragenAusgeben():
	for prfgFragenID in sorted(pruefungsFragenListeStriped):
		ausgabe.write("\\section{"+lesbar(prfgFragenID)+"}\n");
##		ausgabe.write("\\textbf{Filename}: \\verb|" + prfgFragenID + ".tex|\n\n");
		ausgabe.write("\\textbf{Input}: \\verb|\input{" + prfgFragenID + "}|\n\n");
		ausgabe.write("\\textbf{Beschreibung}: \\\\\n" + ersetzeAlle(prfgFragenID) + "\n\n");
		ausgabe.write("\\input{"+prfgFragenID + ".tex" +"}\n\n");
		wroteBeginItemize = 0;
		for prfgID in prfgDict.keys():
			for usedFrage in prfgDict[prfgID]:
				if usedFrage == prfgFragenID:
					if 0 == wroteBeginItemize:
						ausgabe.write("\\subsection{Verwendung}\n");
						ausgabe.write("Diese Frage wurde in folgenden Prfgs. eingesetzt.\n")
						ausgabe.write('\\begin{itemize}'+"\n");
						wroteBeginItemize = 1;
					ausgabe.write("\\item ")
					ausgabe.write(lesbar(prfgID) + "/Pruefung.tex\\\\\n");
					ausgabe.write(ersetzeAlle(prfgID));
					ausgabe.write("\n");
		if 1 == wroteBeginItemize:
			ausgabe.write('\\end{itemize}'+"\n\n\n");
		else:
			ausgabe.write("Diese Frage wurde noch nicht verwendet.\n\n");
		ausgabe.write('\\newpage\n');

vorlage = open('pruefungsIndexVorlage.tex', 'rt');
ausgabe = open('pruefungsIndex.tex', 'wt');

preambel = 1;
for line in vorlage.readlines():
	if '#CONTENT#' in line:
		preambel = 0;
		alleFragenAusgeben();
	else :
		ausgabe.write(line);

print('... erstellt.')
