# -*- coding: utf-8 -*-
import general_manager as gen_man


class OrthTypeCaseManager(gen_man.GeneralManager):
    '''
    Manager predykatow pierwszego typu
    '''

    def __init__(self, np_adjp_phrase):
        gen_man.GeneralManager.__init__(self, np_adjp_phrase)


    def get_orth_at(self, position, tagset):
        '''
        Zwraca ortha na zadanej pozycji
        Kontroluje granice frazy
        '''
        if self.is_outside_ann_phrase(position):
            return None
        return self.get_orth_at_pos(position, tagset)

    def get_orth_at_pos(self, position, tagset):
        '''
        Zwraca ortha na zadanej pozycji,
        UWAGA! Nie kontroluje granic frazy!
        '''
        return self.np_adjp().annotated_sentence().tokens()[
            self.np_adjp().segments()[position]].get_preferred_lexeme(
            tagset).lemma_utf8()

    def is_tag_at(self, position, tagset, tag_str):
        '''
        Sprawdzamy czy token na zadanej pozycji posiada tag przekazany w parametrze metody (jako string np: "gen")
        Sprawdza granice zdania, w przypadku kiedy pozycja wychodzi poza granice zdania, zwracana jest wartosc falszu
        '''
        if self.is_outside_ann_phrase(position):
            return None
        return self.is_tag_at_pos(self, position, tagset, tag_str)

    def is_tag_at_pos(self, position, tagset, tag_str):
        '''
        Sprawdzamy czy token na zadanej pozycji posiada tag przekazany w parametrze metody (jako string np: "gen")
        UWAGA!
            Nie sa sprawdzane granice zdania! Kontrola poprawnosci spoczywa na uzytkowniku!
            Metoda is_tag_at wlacza kontrole nad granicami frazy!
        '''
        lexeme = self.np_adjp().annotated_sentence().tokens()[
            self.np_adjp().segments()[position]].get_preferred_lexeme(tagset)
        tag_mask = tagset.parse_symbol(tag_str)
        position_mask = lexeme.tag().get_masked(tag_mask)
        return position_mask == tag_mask

    def get_cas_str_at(self, position, tagset):
        if self.is_outside_ann_phrase(position):
            return None
        return self.get_cas_str_at_pos(position, tagset)

    def get_cas_str_at_pos(self, position, tagset):
        lexeme = self.np_adjp().annotated_sentence().tokens()[
            self.np_adjp().segments()[position]].get_preferred_lexeme(tagset)
        cas_value = lexeme.tag().get_masked(self.np_adjp().cas_mask)
        return tagset.tag_to_symbol_string(cas_value)

    def is_any_known_tag(self, position, tagset, tags):
        '''
        Sprawdza, czy na zadanej pozycji znajduje sie "znany" tag - tag znajdujacy sie w liscie tagow
        '''
        for tag in tags:
            if self.is_tag_at_pos(position, tagset, tag):
                return True

    def get_first_not_known_tag_left_head_agp(self, position, tagset, tags):
        '''
        zwraca pierwsza pozycje glowy agp/pp/np z lewej, ktorej tag jest nieznany
        '''
        h_idx = self.np_adjp().get_relative_agp_heads_pos().index(position)
        for hidx in range(h_idx - 1, -1, -1):
            found = False
            for tag in tags:
                if self.is_tag_at_pos(
                        self.np_adjp().get_relative_agp_heads_pos()[hidx],
                        tagset, tag):
                    found = True
                    break
            if not found:
                return self.np_adjp().get_relative_agp_heads_pos()[hidx]
        return None

    # ???
    # XXX Byl ten return a przed nim None, o co chodzi?
    # return self.get_left_agp_head(position) != None
