import string
import datetime

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

all_chars = string.ascii_uppercase + string.digits

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"
]

# ─────────────────────────────────────────────
# Load coded message
# ─────────────────────────────────────────────

message_date = input("Please provide the date: ")
file_name = f"coded_{message_date}.txt"

try:
    with open(file_name, "r", encoding="utf-8") as f:
        message = f.read()
except FileNotFoundError:
    exit()

# ─────────────────────────────────────────────
# Transposition key — relaxed validation
# ─────────────────────────────────────────────

final_transp_key = ""
while not final_transp_key:
    transp_key = input("Please enter key: ")
    clean_transp_key = ""
    for letter in transp_key.upper():
        if letter in all_chars:
            clean_transp_key += letter
    final_transp_key = ""
    if clean_transp_key:
        for letter in clean_transp_key:
            if letter not in final_transp_key:
                final_transp_key += letter

# ─────────────────────────────────────────────
# Reverse transposition
# ─────────────────────────────────────────────

transp_list = []
for letter in final_transp_key:
    transp_list.append(letter)
transp_list.sort()

message_list = message.split()

if len(message_list) == len(transp_list):
    transp_dict = {}
    for i in range(len(transp_list)):
        transp_dict[transp_list[i]] = message_list[i]

    ordered_transp_list = []
    for letter in final_transp_key:
        ordered_transp_list.append(transp_dict[letter])

    seq_lengths = []
    for seq in ordered_transp_list:
        seq_lengths.append(len(seq))

    len_reference = max(seq_lengths)

    subst_message = ""
    for i in range(0, len_reference):
        for seq in ordered_transp_list:
            try:
                subst_message += seq[i]
            except:
                pass
else:
    subst_message = "Q"

# ─────────────────────────────────────────────
# Substitution key — relaxed validation
# ─────────────────────────────────────────────

final_subst_key = ""
while not final_subst_key:
    subst_key = input("Please enter key: ")
    clean_subst_key = ""
    for letter in subst_key.upper():
        if letter in all_chars:
            clean_subst_key += letter
    final_subst_key = ""
    if clean_subst_key:
        for letter in clean_subst_key:
            if letter not in final_subst_key:
                final_subst_key += letter

# ─────────────────────────────────────────────
# Rebuild reversed substitution dictionary
# ─────────────────────────────────────────────

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

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

# ─────────────────────────────────────────────
# Decode
# ─────────────────────────────────────────────

if subst_message == "Q":
    decoded_message = "WENEEDCOFFEEASAP"
else:
    decoded_message = ""
    for i in range(0, len(subst_message), 2):
        pair = subst_message[i:i+2]
        decoded_message += matrix_dict_dec[pair]

# ─────────────────────────────────────────────
# Export decoded message
# ─────────────────────────────────────────────

today_str = datetime.date.today().strftime("%Y_%m_%d")
export_name = f"decoded_{message_date}.txt"

with open(export_name, "w", encoding="utf-8") as f:
    f.write(f"Decoded on: {today_str}\n")
    f.write("=" * 20 + "\n")
    f.write(f"{decoded_message}")

print(f"\nMessage decoded and exported successfully as {export_name}")
print(f"Message: {decoded_message}")
