import re


def konkordanz(dateiname_einlesen, suchwort, slicing_indexintervall):
	"""(word, word, number)   ->  string, string, int
	    returns the concordance and all found search term indexes of a within a textfile 
	    existing word by a user given name of textfile, as well as a search term and an 
	    intervall that will control for how many indexes the concordance shall be identified
        >>> Gib den Dateinamen der einzulesenden Datei ein: minitext_token
        >>> Gib ein Suchwort ein, um seine Konkrodanz zu erzeugen: Kaninchenbau
        >>>Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: 3
        Hinunter in den             Kaninchenbau          .  Alice                         Suchwortindex: 6
        Der Eingang zum             Kaninchenbau          lief erst geradeaus              Suchwortindex: 305
	"""
	wortmuster = re.compile("[A-Za-z]")
	zahlenmuster = re.compile("[0-9]")
	try:
		inhalte_datei = open(dateiname_einlesen + ".txt", "r", encoding="utf8")
	except FileNotFoundError:
		print ("Diese Datei existiert nicht. Versuchen Sie es erneut")
		return konkordanz(input("Gib den Dateinamen der einzulesenden Datei ein: "), input("Gib ein Suchwort ein, um seine Konkordanz zu erzeugen: "), input("Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: "))
	rohzeichenketten_liste = inhalte_datei.readlines()
	rohwerte_index = 0
	zeichenketten_liste = []
	konkordanz_datei = open("konkordanz.txt", "a", encoding = "utf8")
	print("Gefundene Konkordanzen zum Suchwort '{}':".format(suchwort), file = konkordanz_datei)
	konkordanz_datei.close()
	if not re.search(wortmuster, suchwort):
		print("Bei Deiner Eingabe für das Suchwort handelt es sich nicht um ein Wort! Gib erneut die angefragten Werte ein!")
		return konkordanz(input("Gib den Dateinamen der einzulesenden Datei ein: "), input("Gib ein Suchwort ein, um seine Konkordanz zu erzeugen: "), input("Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: "))
	elif not re.search(zahlenmuster, slicing_indexintervall):
		print("Bei Deiner Eingabe für das Konkordanzintervall handelt es sich nicht um eine Zahl! Gib erneut die angefragten Werte ein!")
		return konkordanz(input("Gib den Dateinamen der einzulesenden Datei ein: "), input("Gib ein Suchwort ein, um seine Konkordanz zu erzeugen: "), input("Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: "))
	else:
		while rohwerte_index < len(rohzeichenketten_liste):    #while-Schleife, um durch rohzeichenketten_liste zu laufen und unerwünschte Zeichen zu entfernen
			zeichenketten_liste.append(rohzeichenketten_liste[rohwerte_index].strip("\n"))  #an betreffender Indexposition wird \n von der Zeichenkette entfernt und bereinigte Indexposition wird an Liste "zeichenketten_liste" angehangen
			rohwerte_index = rohwerte_index + 1            #nach jedem Schleifendurchlauf wird rohwerte_index um 1 erweitert
		#print(zeichenketten_liste)	
		if suchwort not in zeichenketten_liste:     #Abfangen von falschen Suchwort-Eingaben durch den Nutzer
			print("Dein Suchwort '{}' konnte nicht in der Datei gefunden werden. Gib erneut die angefragten Werte ein!".format(suchwort))
			return konkordanz(input("Gib den Dateinamen der einzulesenden Datei ein: "), input("Gib ein Suchwort ein, um seine Konkordanz zu erzeugen: "), input("Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: "))
		suchwort_index = 0
		while suchwort_index < len(zeichenketten_liste):
			if re.match(suchwort, zeichenketten_liste[suchwort_index]):
				x = suchwort_index - int(slicing_indexintervall)   #Definition der x-Indexkoordinate: wie hoch der Index für das Slicing nach vorne (weg vom Suchwortindex) sein soll
				y = suchwort_index + int(slicing_indexintervall) + 1    #Definition der y-Indexkoordinate: wie hoch der Index für das Slicing nach hinten (weg vom Suchwortindex) sein soll
				vorslicing_suchwortindex = zeichenketten_liste[x:suchwort_index]     #Definition des Slicingintervalls vom Suchwort weg nach vorne 
				vorslicing_suchwortindex_string = " ".join(vorslicing_suchwortindex)   #Umwandlung in String
				vorslicing_suchwortindex_stringlaenge = len(vorslicing_suchwortindex_string)
				#Formatierung Textdatei "konkordanz.txt" - wie viele Leerzeichen sollen zwischen angezeigtem Suchwort und nach Vorne hin gefundener Konkordanz liegen:
				vorslicing_suchwortindex_string += (40 - vorslicing_suchwortindex_stringlaenge)*" "   
				nachslicing_suchwortindex = zeichenketten_liste[suchwort_index+1:y]   #Definition des Slicingintervalls vom Suchwort weg nach hinten
				nachslicing_suchwortindex_string = " ".join(nachslicing_suchwortindex)  #Umwandlung in String
				nachslicing_suchwortindex_stringlaenge = len(nachslicing_suchwortindex_string)
				#Formatierung Textdatei "konkordanz.txt" - wie viele Leerzeichen sollen zwischen der vom Suchwort ausgehend nach Hinten hin gefundener Konkordanz und Suchwort-Index-Anzeige liegen:
				nachslicing_suchwortindex_string += (45 - nachslicing_suchwortindex_stringlaenge)*" "
				#print("Das Suchwort '{}' befinet sich in der Liste.".format(suchwort))
				string = " "
				string_laenge = len(suchwort)
				#Formatierung Textdatei "konkordanz.txt" - wie viele Leerzeichen sollen zwischen Suchwort und nach Hinten hin gefundener Konkordanz liegen:
				string += (20 - string_laenge) * " "
				print("{} {} {} Suchwortindex: {}".format(vorslicing_suchwortindex, suchwort, nachslicing_suchwortindex, suchwort_index))	
				suchwort_index = suchwort_index + 1       #nach jedem Schleifendurchlauf wird suchwort_index um 1 erweitert
				#Inhalte in Datei "konkordanzen.txt" schreiben:
				konkordanz_datei = open("konkordanz.txt", "a", encoding = "utf8")   
				#print("{} {} {} Suchwortindex: {}".format(vorslicing_suchwortindex, suchwort, nachslicing_suchwortindex, suchwort_index), file = konkordanz_datei)
				print("{} {} {} Suchwortindex: {}".format(vorslicing_suchwortindex_string, suchwort + string, nachslicing_suchwortindex_string, suchwort_index), file = konkordanz_datei)
				konkordanz_datei.close()
			else:
				suchwort_index = suchwort_index + 1   #ist Suchwort unter suchwort_index nicht in Liste, suche in der Liste eine Position weiter
	
	
	#Abfrage, ob Programm erneut durchgeführt werden soll:
	choice = ("y" or "Y" or "n" or "N")			
	while choice == ("y" or "Y" or "n" or "N"):
		while True:
			choice = input("Möchtest Du die Konkordanzen für ein weiteres Suchwort ermitteln? [y/n] - ")
			if choice == "y" or choice == "Y":
				konkordanz(input("Gib den Dateinamen der einzulesenden Datei ein: "), input("Gib ein Suchwort ein, um seine Konkordanz zu erzeugen: "), input("Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: "))
			elif choice == "n" or choice == "N":
				print("Gut! Dann bis zum nächsten Mal.")
				break
			elif (choice != "y" or choice != "Y") or (choice != "n" or choice != "N"):
				choice = input("Möchtest Du die Konkordanzen für ein weiteres Suchwort ermitteln? [y/n] - ")
		
			

konkordanz(input("Gib den Dateinamen der einzulesenden Datei ein: "), input("Gib ein Suchwort ein, um seine Konkordanz zu erzeugen: "), input("Gib eine Zahl ein, um den Indexintervall zu bestimmen, in dem links und rechts um das Suchwort die Konkordanz erzeugt werden soll: "))


