import string
import datetime

# ─────────────────────────────────────────────
# Character set
# ─────────────────────────────────────────────

all_chars = string.ascii_uppercase + string.digits

# ─────────────────────────────────────────────
# Key 1 — substitution key
# ─────────────────────────────────────────────

final_subst_key = ""
while len(final_subst_key) < 6:
    subst_key = input("Please enter substitution key: ")
    clean_subst_key = ""
    for letter in subst_key.upper():
        if letter in all_chars:
            clean_subst_key += letter
    final_subst_key = ""
    for letter in clean_subst_key:
        if letter not in final_subst_key:
            final_subst_key += letter
    if len(final_subst_key) < 6:
        print("Invalid key. Please try again.")

# ─────────────────────────────────────────────
# Build sorted character sequence
# ─────────────────────────────────────────────

sorted_chars = ""
reference = final_subst_key + all_chars
for letter in reference:
    if letter not in sorted_chars:
        sorted_chars += letter

# ─────────────────────────────────────────────
# Build substitution dictionary
# ─────────────────────────────────────────────

matrix_letters = [
    "AA", "AD", "AF", "AG", "AV", "AX",
    "DA", "DD", "DF", "DG", "DV", "DX",
    "FA", "FD", "FF", "FG", "FV", "FX",
    "GA", "GD", "GF", "GG", "GV", "GX",
    "VA", "VD", "VF", "VG", "VV", "VX",
    "XA", "XD", "XF", "XG", "XV", "XX"
]

matrix_dict = {}
for i in range(0, len(sorted_chars)):
    matrix_dict[sorted_chars[i]] = matrix_letters[i]

# ─────────────────────────────────────────────
# Message input and cleaning
# ─────────────────────────────────────────────

message = ""
while not message:
    message = input("Enter your message: ")

clean_message = ""
for letter in message.strip().upper():
    if letter in all_chars:
        clean_message += letter

# ─────────────────────────────────────────────
# Substitution
# ─────────────────────────────────────────────

substituted_message = ""
for letter in clean_message:
    substituted_message += matrix_dict[letter]

# ─────────────────────────────────────────────
# Key 2 — transposition key
# ─────────────────────────────────────────────

final_transp_key = ""
while len(final_transp_key) < 6:
    transp_key = input("Please enter transposition key: ")
    clean_transp_key = ""
    for letter in transp_key.upper():
        if letter in all_chars:
            clean_transp_key += letter
    final_transp_key = ""
    for letter in clean_transp_key:
        if letter not in final_transp_key:
            final_transp_key += letter
    if len(final_transp_key) < 6:
        print("Invalid key. Please try again.")

# ─────────────────────────────────────────────
# Transposition
# ─────────────────────────────────────────────

transp_dict = {}
for letter in final_transp_key:
    transp_dict[letter] = ""

col_index = 0
for char in substituted_message:
    transp_dict[final_transp_key[col_index]] += char
    if col_index == len(final_transp_key) - 1:
        col_index = 0
    else:
        col_index += 1

final_message = ""
for key in sorted(transp_dict):
    final_message += transp_dict[key]
    final_message += " "

print("Message coding complete!")
print(final_message)

# ─────────────────────────────────────────────
# Export to file
# ─────────────────────────────────────────────

today_string = datetime.date.today().strftime("%Y_%m_%d")
file_name = f"coded_{today_string}.txt"

with open(file_name, "w", encoding="utf-8") as f:
    f.write(final_message)
print(f"Coded message exported to {file_name} successfully!")
