import random

class NameGenerator():
    def __init__(self) -> None:
        with open("gwendolyn/resources/names.txt", "r", encoding="UTF-8") as file_pointer:
            self._names = file_pointer.read().lower().split("\n")

        self._gen_letter_dict()

    def _gen_letter_dict(self):
        list_of_names = []
        for name in self._names:
            if (name != ""):
                list_of_names.append("__" + name + "__")

        dict_of_names = {}
        for name in list_of_names:
            for i in range(len(name)-3):
                combination = name[i:i+2]
                if combination not in dict_of_names:
                    dict_of_names[combination] = []
                dict_of_names[combination].append(name[i+2])

        self._letter_dict = dict_of_names

    def generate(self):
        combination = "__"
        next_letter = ""
        result = ""

        while True:
            number_of_letters = len(self._letter_dict[combination])
            index = random.randint(0,number_of_letters - 1)
            next_letter = self._letter_dict[combination][index]
            if next_letter == "_":
                break
            else:
                result = result + next_letter
                combination = combination[1] + next_letter

        return result.title()

if __name__ == "__main__":
    print(NameGenerator().generate())