# -*- encoding: iso-8859-1 -*-

"""Verwalter eines Eintrags 
"""

import re, sys


class Entry:
	"""
	macht die einzelnen Informationseinheiten innerhalb eines Eintrags 
	zugänglich. Kann den Informationseinheiten neue Werte zuweisen.
	
	Veränderung zur Version classEntry03: 
	wl1 und wl2 enthalten eine Angabe zu ihrer Frequenz im Korpus: 
	[(VERSION1, FREQ), (VERSION2, FREQ), ...]
	"""

	def __init__(self, entry):
		"""bekommt einen kompletten Wörterbucheintrag in einer Liste. Legt 
		für die Informationseinheiten Klassenattribute an. Weist self.ident 
		einen Wert zu. ruft die parse-Fuktion zur Bestimmung der anderen 
		Klassenattribute auf. 
		"""
		self.ident = re.search("[0-9]+", entry[0]).group()
		self.wl2 = []
		self.zDic = {}
		self.qList = []
		self.unknown = ""
		
		self._parse(entry)


	def _parse(self, entry):
		"""bekommt einen kompletten Wörterbucheintrag in einer Liste. 
		Weist den folgenden Klassenattributen einen Wert zu: self.wl1, 
		self.wl2, self.ibed, self.rectyp, self.zDic, self.qList, 
		self.author, self.date, self.unknown.
		"""
		for line in entry[1:]:
			mat = re.search("WL1:\s(.+)", line)
			if mat:
				self.wl1 = self._transInList(mat.group(1))

			mat = re.search("WL2:\s?(.*)", line)
			if mat:
				if mat.group(1):
					self.wl2 = self._transInList(mat.group(1))

			mat = re.search("IBED:\s([0-9]+)", line)
			if mat:
				self.ibed = mat.group(1)
			
			mat = re.search("RECTYP:\s([0-9]+)", line)
			if mat:
				self.rectyp = mat.group(1)

			mat = re.search(
				"(Z[0-9]+|newZ[0-9])((\s+[0-9]+){4,4})", line)
			if mat:
				self.zDic[mat.group(1)] = tuple(mat.group(2).split())
				
			mat = re.search(
 				"(Q[0-9]+)((\t[0-9]+|\t[a-z]+[0-9]?=[0-9]+){4,4})", line)
			if mat:
				tup = ((mat.group(1)), (tuple(mat.group(2).split()))) 
				self.qList.append(tup)

			mat = re.search("AUTOR:\s([A-Z]+)", line)
			if mat:
				self.author = mat.group(1)

			mat = re.search("DATUM:\s?([0-9]*)", line)	
				#Datum ist nicht immer vermerkt, deshalb "*" statt "+"
			if mat:
				self.date = mat.group(1)
				
			mat = re.search("UNBEKANNT:\s(.+)", line)
			if mat:
				self.unknown = mat.group(1)

				
	def _transInList(self, lemma):
		"""bekommt ein Lemma, hinter dem durch 'µ' getrennt dessen Frequenz steht.
		Macht aus den Lemma-Frequenz-Paaren Tupel und speichert sie in einer Liste:
		[(VERSION1, FREQ), (VERSION2, FREQ),...]. Übergibt die neue Lemmaliste.
		"""
		lemma = lemma.split("\t")
		lemma = [tuple(lem.split("µ")) for lem in lemma]
		return lemma
				
		
	def _mostProb1(self):
		"""erstellt eine Kopie von self.wl1. Ermittelt anhand der Freqenz
		die wahrscheinlichste Lemmaversion. 
		"""
		wl1Tmp = self.wl1[:]
#		print wl1Tmp
		wl1Tmp.sort(self._cmpTup)
		if wl1Tmp[0][1] == "0":
			self.wl1MostProb = None
		else:	
			self.wl1MostProb = wl1Tmp[0]
#		print wl1Tmp

			
		
	def _mostProb2(self):
		"""erstellt eine Kopie von self.wl2. Ermittelt anhand der Freqenz
		die wahrscheinlichste Lemmaversion. 
		"""	
		wl2Tmp = self.wl2[:]
		wl2Tmp.sort(self._cmpTup)
		if wl2Tmp[0][1] == "0":
			self.wl2MostProb = None
		else:
			self.wl2MostProb = wl2Tmp[0]
			

	def _cmpTup(self, tup1, tup2):
		"""bekommt zwei Tupel, deren zweiter Teil eine Zahl enthält. Entscheidet
		welches Lemma die größere Zahl hat.
		"""
		return cmp(int(tup2[1]),int(tup1[1]))


	def getIdent(self):
		"""gibt die ID-Nummer als String zurück
		"""
		return self.ident
			
			
	def getWl1(self):
		"""gibt das Wortlemma1 als Liste mit Tupeln zurück: 
		[(LEMMA-Original, FREQUENZ), (LEMMA-Version1, FREQUENZ), 
			(LEMMA-Version2, FREQUENZ), ...]
		"""
		return self.wl1	
	
		
	def setWl1(self,wl1):
		"""weist Wortlemma1 einen neuen Wert zu.
		"""
		self.wl1 = wl1	
		
		
	def getWl1Origin(self):
		"""übergibt die Originalversion aus WDG von Wortlemma1
		"""
		return self.wl1[0]
		
	
	def getWl1MostProb(self):
		"""gibt das Wortlemma1 mit der höchsten Trefferanzahl zurück.
		Wenn keine Lemmaversion mehr als 0 Treffer hat, wird None 
		zurückgegeben.
		"""
		self._mostProb1()
		return self.wl1MostProb
		
		
	def getWl1Rest(self):
		"""übergibt alle Wortlemma1-Versionen, die nicht das Original 
		sind. Sonst die leere Liste.
		"""
		return self.wl1[1:]


	def getWl2(self):
		"""gibt das Wortlemma2 als Liste mit Tupeln zurück: 
		[(LEMMA-Original, FREQUENZ), (LEMMA-Version1, FREQUENZ), 
			(LEMMA-Version2, FREQUENZ), ...].
		Ist kein Wortlemma2 verzeichnet, wird die leere Liste zurückgegeben.
		"""
		return self.wl2
		
		
	def setWl2(self,wl2):
		"""weist Wortlemma2 einen neuen Wert zu.
		"""	
		self.wl2 = wl2	
		
		
	def getWl2Origin(self):
		"""übergibt die Originalversion aus WDG von Wortlemma2
		"""	
		return self.wl2[0]
		
	
	def getWl2MostProb(self):
		"""gibt das Wortlemma2 mit der höchsten Trefferanzahl zurück.
		Wenn keine Lemmaversion mehr als 0 Treffer hat, wird None 
		zurückgegeben.
		"""
		self._mostProb2()
		return self.wl2MostProb
		
		
	def getWl2Rest(self):
		"""übergibt alle Wortlemma2-Versionen, die nicht das Original 
		sind. Sonst die leere Liste.
		"""
		return self.wl2[1:]


	def getIbed(self):
		"""gibt die Bedeutungsnummer als String zurück.
		"""
		return self.ibed


	def getRectyp(self):
		"""gibt den Rektionstyp als String zurück.
		"""	
		return self.rectyp


	def getZ(self):
		"""gibt alle Z-Zeilen in einem Dictionary zurück. Der Key
		besteht aus dem Kopf der Zeile, das Value aus einem Quadrupel 
		mit den vier folgenden Zahlen, z.B.:
		{Z1: (0, 0, 1, 0), Z2: (1, 0, 3, 0), ...}
		"""
		return self.zDic	
		
		
	def setZ(self, zDic):
		"""weist dem Dictionary, das die Z-Zeilen enthält einen neuen
		Wert zu.
		"""
		self.zDic = zDic


	def getQ(self):
		"""gibt alle Q-Zeilen in einer Liste mit Tupeln zurück. Das 
		Tupel besteht aus dem Kopf der Zeile und aus einem Vierer-Tupel 
		mit den vier folgenden Elementen, z.B.:
		[('Q1', ('0', 'jwk=40', 'jstw=0', 'jbed=9')), 
		('Q15', ('ksubk=1', 'kgrph=2', 'kkla1=0', 'kkla2=0')), 
		...]
		"""	
		return self.qList

		
	def getUnknown(self):
		"""gibt einen String von Daten zurück, die in keines der definierten 
		Schemen passen.
		"""
		return self.unknown
		
		
	def getAuthor(self):
		"""gibt einen String zurück, der vermutlich den Autor des 
		WDG-Eintrags enthält.
		"""
		return self.author


	def getDate(self):
		"""gibt Zahlen - vermutlich das Eintragungsdatum - als String zurück.
		"""
		return self.date
				
