#!/usr/bin/env python3

import hashlib
import secrets
import random

from flag import FLAG

secret_1 = secrets.token_hex(8)
secret_2 = [x for x in secrets.token_hex(1) for i in range(8)]
secret_2 = str(secret_2.sort())

secret = f"{secret_1}{secret_2}"

def create_msg(rope_length):
    return f"rope_length={rope_length};".encode()

def create_hash(secret, msg):
    return hashlib.sha1(secret.encode() + b";" + msg).hexdigest()

def check_rope(secret, msg, h):
    if create_hash(secret, msg) != h:
        return (0, False)

    rope_length = 0
    try:
        for part in msg.split(b";")[:-1]:
            key, val = part.split(b"=")
            if key == b"rope_length":
                rope_length = int(val)
    except ValueError:
        return (rope_length, False)
    return (rope_length, True)


DIST_TO_FLAG = 10

print(f"""
ÅH NEEEEJ! En flagga har ramlat ner i vattnet, kan du rädda den?

Jag har gått en livräddningskurs, då fick jag höra att man ska använda en förlängd arm så att man inte själv ramlar i. Flaggan verkar vara {DIST_TO_FLAG} meter bort.
""")

while True:
    print("""Vad vill du göra?
1: Få ett rep
2: Försöka rädda flaggan
3: Avsluta :(""")
    ans = input()
    match ans:
        case "1":
            new_rope_length = random.randint(0, 9)
            msg = create_msg(new_rope_length)
            h = create_hash(secret, msg)
            print(f"Ditt nya rep är så här långt: {new_rope_length}")
            print(f"Här är ditt rep (hex): {msg.hex()}")
            print(f"Här är ditt kvitto på att det håller: {h}")

        case "2":
            rope = input("Ge mig ditt rep (hex), så kan jag kolla att det håller: ")
            h = input("Har du ett kvitto på detta?: ").strip()

            try:
                msg = bytes.fromhex(rope.strip())
            except ValueError:
                print("Åh nej, det där var inget rep alls!!! Flaggan drunknar!!!")
                exit()

            length, valid = check_rope(secret, msg, h)
            if not valid and length == 0:
                print("Åh nej, ditt rep höll inte!!! Flaggan drunknar!!!")
                exit()

            if not valid:
                print("Åh nej, du hade ett konstigt rep? Det gick sönder och flaggan drunknade :(")
                exit()

            if length < DIST_TO_FLAG:
                print("Åh nej, ditt rep var för kort!!! Flaggan drunknar!!!")
                exit()

            print("Ditt rep räckte till flaggan och det höll!!! Hurra, flaggan lever!!!")
            print(f"Den hälsar: {FLAG}")
            exit()

        case "3":
            print("Åh nej! Ska du verkligen bara lämna flaggan att dö så här?!?!?! Den drunknar nu!")
            exit()