"""Genesis Recovery. Python 3."""
import hashlib

ORIGINAL = {1: "TONY", 2: "IS", 3: "SAFE"}
TRANSMISSIONS = [
    [(1, "TONY"), (2, "??"), (3, "SAFE")],
    [(1, "TONY"), (3, "SAFE")],
    [(3, "SAFE"), (1, "TONY"), (2, "IS")],
    [(1, "TONY"), (1, "TONY"), (3, "SAFE")],
]


def fingerprint(text):
    data = text.encode("utf-8")
    return hashlib.sha256(data).hexdigest()


def verify(transmission, manifest):
    accepted = {}
    for number, text in transmission:
        if number in manifest:
            if fingerprint(text) == manifest[number]:
                accepted[number] = text
    return accepted


def play():
    manifest = {}
    for number, text in ORIGINAL.items():
        manifest[number] = fingerprint(text)

    print("GENESIS RECOVERY")
    print("Test copies before releasing them.")
    print("Commands: test, retry, release, q")
    score = 0
    level = 0

    for transmission in TRANSMISSIONS:
        level = level + 1
        current = list(transmission)
        print("\nCopy", level)
        print(current)

        while True:
            choice = input("> ").strip().lower()
            if choice == "q":
                print("Saved learning, no lost lives.")
                return
            if choice == "test":
                accepted = verify(current, manifest)
                print("Verified:", sorted(accepted))
                print("Needed:", sorted(manifest))
            elif choice == "retry":
                current = list(ORIGINAL.items())
                print("Clean replacement ready.")
            elif choice == "release":
                accepted = verify(current, manifest)
                if len(accepted) == len(manifest):
                    words = []
                    for number in sorted(accepted):
                        words.append(accepted[number])
                    print(" ".join(words))
                    score = score + 1
                    break
                print("Incomplete. Test or retry.")
            else:
                print("Use test, retry, release or q.")

    print("All", score, "copies verified.")
    print("Evidence preserved!")


if __name__ == "__main__":
    play()
