from collections import Counter


def top_letters_in_file(file_name, num=3):
    counter = Counter()  # {obj1: count1, obj2: count2, ...}
    with open(file_name, encoding="utf8") as f:  # (*) komentarz na dole pliku!
        for line in f:
            for character in line:
                if character.isalpha():
                    counter.update(character)
    lst = [character for character, _ in counter.most_common(num)]
    return tuple(lst)


class LanguageLearner:
    def __init__(self, num_letters=3):
        self.num_letters = num_letters
        self.languages = {}
        # słownik jest w formacie {('e', 't', 'a'): 'english'}
        # (odwrotnie, niż w Zadaniu 3 z Listy 7)

    def learn_language(self, file_name, language):
        top_letters = top_letters_in_file(file_name, num=self.num_letters)
        if len(top_letters) < self.num_letters:  # na wszelki wypadek
            raise ValueError("File too short")

        if top_letters in self.languages:
            if language != self.languages[top_letters]:
                raise ValueError(f"Letters {top_letters} already assigned to {self.languages[top_letters]}")
        self.languages[top_letters] = language

    def guess_language(self, file_name):
        top_letters = top_letters_in_file(file_name, num=self.num_letters)
        if len(top_letters) < self.num_letters:  # na wszelki wypadek
            raise ValueError("File too short")
        return self.languages.get(top_letters, "unknown")


if __name__ == "__main__":
    # pliki .txt z poprzedniego wykładu
    learner = LanguageLearner(3)
    learner.learn_language("20000en.txt", "english")
    print(learner.guess_language("prideandprejudice.txt"))
    print(learner.guess_language("southpole.txt"))
    print(learner.guess_language("20000.txt"))


# (*) w praktyce dla funkcji pracujących z plikami możemy chcieć
# umożliwić użytkownikowi sprecyzowanie kodowania, np.:
'''
def func(file_name, encoding="utf8"):
...
    with open(file_name, encoding=encoding):
        ...
'''
