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

"""Verwalter von Suffixen
"""

import sys


class SuffixManager:
	"""Suffixe von Lemmata können angefügt oder entfernt werden.
	Das Anhängen von Suffixe ist bei Präsens-, Infinitiv- Konjunktiv- Komparativ-
	und Superlativstämmen notwendig, um in den Korpora des IDS Treffer
	zu bekommen;  z.B. "ABGIB" -> "ABGIBST", "AAS" -> "AASEN", "NÄHM" ->"NÄHME"
	"ÄRM" ->"ÄRMER", "NÄCH" -> "NÄCHSTE". 
	"""
	
	
	def __init__(self, p):
		"""bekommt ein Objekt der Klasse Entry03 in Form einer Liste. Macht 
		daraus ein Klassenattribut.
		"""
		self.p = p
	

		
	def appendSuffix(self):
		"""überprüft durch den Aufruf von checkStemm, ob Endungen an
		das Lemma angefügt werden sollen. Wenn ja, wird das Lemma mit
		Endung übergeben, ansonsten das unveränderte Lemma. 
		"""
		suffix = self._checkStemm()
		if suffix:
			return self._concSuffix(self.p.getWl1(), suffix)
		else:
			return self.p.getWl1()
			
			
	def rmInsertedSuffix(self):
		"""überprüft durch den Aufruf von checkStemm, ob Endungen von 
		dem Lemma entfernt werden müssen. Wenn ja, wird das Lemma ohne
		Endung übergeben, ansonsten das unveränderte Lemma. 
		"""	
		suffix = self._checkStemm()
		if suffix:
			newWl1 = []
			zDic = self.p.getZ()
			for lemTup in self.p.getWl1():
				if lemTup[0].endswith(suffix):
					newWl1.append((self._rmSuffix(lemTup[0],suffix), lemTup[1]))
				else:
					newWl1 = self.p.getWl1()
					sys.stderr.write("FEHLER: ID " + self.p.getIdent(
						) + " " + lemTup[0] + " sollte Suffix " + suffix + " haben \n")
			return newWl1
		else:
			return self.p.getWl1()

			
	def _checkStemm(self):
		"""überprüft das Lemma nach Wortart und Stamm. Gibt, wenn nötig das 
		entsprechende Suffix zurück, ansonsten None.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == "1" and zDic.has_key("Z6"):
			#überpruefe, ob durch binäre Addition eine 32 ( = Konjunktivstamm) vorkommt
			if not (int (zDic["Z6"][2])&32) == 0:	
				return "E"
			#überpruefe, ob durch binäre Addition eine 1 ( = Infinitivstamm) vorkommt
			elif not (int (zDic["Z6"][2])&1) == 0:
				if zDic.has_key("Z2"):
					return self._findInfSuffix(zDic["Z2"][1]) 
				else:	
					return "EN"
			#überpruefe, ob durch binäre Addition eine 2 ( = Präsensstamm) vorkommt
			elif not (int(zDic["Z6"][2])&2) == 0:	
				if zDic.has_key("Z1"):
					return self._findPraesSuffix(zDic["Z1"][2])
		if self.p.getRectyp() == "3" and zDic.has_key("Z2"):
			# Komparativstamm
			if zDic["Z2"][0] =="2" or zDic["Z2"][0] =="4":	
				return "ER"
			# Superlativstamm
			elif zDic["Z2"][0] =="3":
				return self._findSuperlSuffix(zDic["Z2"][3])
				
				
	def _findInfSuffix(self, code):
		"""bekommt einen Kode, der aus Z2/2 entnommen ist. Wählt das richtige
		Infinitivsuffix für das aktuelle Wortlemma aus.
		"""
		if code == "0":
			return "EN"
		elif code == "1":
			return "N"
		
		
	def _findPraesSuffix(self, code):
		"""bekommt einen Kode, der aus Z1/3 entnommen ist. Wählt das richtige 
		Präsenssuffix für das aktuelle Wortlemma aus.
		"""
		if code == "0" or code == "6":
			return "T"
		elif code == "1" or code == "2" or code == "3" or code == "5":
			return ""
		elif code == "4":
			return "E"
			
			
	def _findSuperlSuffix(self, code):
		"""bekommt einen Kode, der aus Z2/4 entnommen ist. Wählt das richtige 
		Superlativsuffix für das aktuelle Wortlemma aus.
		"""
		if code == "1":
			return "STE"
		elif code == "2":
			return "ESTE"	
		
	
	def _concSuffix(self, lemList, suffix):
		"""bekommt die aktuelle Wortlemma1-Liste und ein Suffix. Hängt
		das Suffix an jede Wortlemma-Version.
		"""
		return [lem + suffix for lem in lemList]
	

	def _rmSuffix(self, lemma, suffix):
		"""bekommt ein Lemma und ein Suffix. Gibt das Lemma ohne Suffix zurück.
		"""
		lemma = lemma[:-len(suffix)]
		return lemma
