#!/usr/bin/python

from itertools import chain, product, permutations

# Santa has caught up with the information age and does not trust
# clear-text commands anymore.
# He has decided that all communications
# have to be encrypted to prevent an unfriendly take-over of his team.
# Santa chooses a simple, secure, and toolless encryption scheme.
# However, his team's memory capacity is limited and so he can only use
# their names (Dasher, Dancer, Prancer, Vixen, Comet, Cupid, Donder and
# Blitzen) as keys.


encrypted = "STTYN YATLOEP DNEA ONBL TGNTO MHEHH EISTIARIB FHSRA LD IIONA NL HERUV LN17-PTAA-RTON-RDOE-MCTN-AHCO"
encrypted_words = encrypted.split(" ")

def load_words():
    with open('words_alpha.txt') as word_file:
        valid_words = set(word_file.read().split())

    return valid_words

english_words = load_words()

# totalCount = 0
# letter_count = {}
# for word in encrypted_words[:-1]:
#     totalCount += len(word)
#     for letter in word:
#         if not letter in letter_count:
#             letter_count[letter] = 1
#         else:
#             letter_count[letter] += 1

# print(letter_count, totalCount)

# def bruteforce(charset, minlength, maxlength):
#     return (''.join(candidate)
#         for candidate in chain.from_iterable(product(charset, repeat=i)
#         for i in range(minlength, maxlength + 1)))
#
# def generateKey(cipher, plain):
#     key = ""
#     for i in range(min(len(cipher), len(plain))):
#         key += chr(ord('A') + ord(cipher[i]) - ord(plain[i]))
#     return key
#
def decrypt(cipher, key):
    while len(key) < len(cipher):
        key += key

    return ''.join([chr(ord('A') + (ord(cipher[i]) + ord(key[i]) - 2 * ord('A')) % 26) for i in range(len(cipher))])


possible_keys = ["DASHER","DANCER","PRANCER","VIXEN","COMET","CUPID","DONDER","BLITZEN"]


# startingLetters = [key[0] for key in possible_keys]
# processedKeys = []
#
# for p in permutations(startingLetters, len(startingLetters)):
#     key = ''.join(p)
#     if key not in processedKeys:
#         processedKeys.append(key)
#         plain = decrypt(encrypted_words[0], key)
#         if plain.lower() in english_words:
#             print(key, plain)

for key in possible_keys:
    print(key, decrypt(encrypted_words[0], key[::-1]))
#
# for key in bruteforce("ABCDEFGHIJKLMNOPQRSTUVXYZ", 5, 5):
#     plain = decrypt(encrypted_words[0], key)
#     if key.lower() in english_words and plain.lower() in english_words:
#         print(key, plain)

# for word in english_words:
#     if len(word) == 5:
#         word = word.upper()
#         key = generateKey(encrypted_words[0], word).lower()
#         # if key.isalpha():
#         if key in english_words:
#             print(word, key)
