import random
from random import shuffle
from time import time
from sys import argv, exit


formules = {
        "cos²+sin²": "1",
        "cos(a+b)": "cos a cos b - sin a sin b",
        "cos(a-b)": "cos a cos b + sin a sin b",
        "sin(a+b)": "sin a cos b + sin b cos a",
        "sin(a-b)": "sin a cos b - sin b cos a",
        "tan(a+b)": "(tan a + tan b)/(1 - tan a tan b)",
        "tan(a-b)": "(tan a - tan b)/(1 + tan a tan b)",
        "cos(2x)": "cos^2 x - sin^2 x",
        "sin(2x)": "2 cos x sin x",
        "tan(2x)": "(2 tan x)/(1 - tan^2 x)",
        "cos²": "(1+cos 2x)/2",
        "sin²": "(1-cos 2x)/2",
        "arc-moitié: cos": "(1-t²)/(1+t²)",
        "arc-moitié: sin": "2t / 1+t²",
        "euler: cos": "1/2 (e^ix + e^-ix)",
        "euler: sin": "1/2i (e^ix - e^-ix)",
        "arc-moitié: tan": "2t / 1-t²",
        "cos a cos b": "1/2 (cos(a+b) + cos(a-b))",
        "cos a sin b": "1/2 (sin(a+b) + sin(a-b))",
        "sin a sin b": "-1/2 (cos(a+b) - cos(a-b))",
        "cos p + cos q": "2 cos(p+q / 2) cos(p-q / 2)",
        "sin p + sin q": "2 sin(p+q / 2) cos(p-q / 2)",
        "cos p - cos q": "-2 sin(p+q / 2) sin(p-q / 2)",
        "sin p - sin q": "2 cos(p+q / 2) sin(p-q / 2)",
        "e^(iθ)": "cosθ + i sinθ",
        "e^(iθ)^n": "e^iθn",
        "1/cos²": "1+tan²",
        "1/sin²": "1+cot²",
        "arccos'": "-1 / √1-x²",
        "arcsin'": "1 / √1-x²",
        "sin'": "cos",
        "cos'": "-sin",
        "arctan'": "1 / 1+x²",
        "tan'": "1 + tan²",
        "cos(x+2π)": "cos x",
        "cos(-x)": "cos x",
        "cos(π-x)": "- cos x",
        "cos(π+x)": "- cos x",
        "cos(π/2 - x)": "sin x",
        "cos(π/2 + x)": "-sin x",
        "sin(x+2π)": "sin x",
        "sin(-x)": "-sin x",
        "sin(π-x)": "sin x",
        "sin(π+x)": "-sin x",
        "sin(π/2 - x)": "cos x",
        "sin(π/2 + x)": "cos x",
        "tan(x+2π)": "tan x",
        "tan(-x)": "-tan x",
        "tan(π-x)": "-tan x",
        "tan(π+x)": "tan x",
        "tan(π/2 - x)": "cot x",
        "tan(π/2 + x)": "-cot x",
}

if __name__ == "__main__":
    command = argv[1] if len(argv) > 1 else "lauront"
    if command == "lauront":
        meantime = 0
        timeout = float(argv[2]) if len(argv) > 2 else 8
        while True:
            remaining = list(formules.keys())
            chosen = random.choice(remaining)
            done = 0
            while remaining:
                # don't pick previous one.
                chosen = random.choice([ r for r in remaining if r != chosen])
                print(chosen)
                start = time()
                input()
                end = time()
                if end-start > timeout:
                    print(f"""
        You took {round(end-start, 1)} > {timeout} seconds. This is too long.
        Here's the answer. Press enter when ready.
        {formules.get(chosen, '<INTERNAL ERROR>')}
                    """)
                    input()
                else:
                    print(f"""
        Is this what you typed? (answer y for yes)
        {formules.get(chosen, '<INTERNAL ERROR>')}
                    """)
                    if input() == "y":
                        remaining.remove(chosen)
                        print(f"{len(remaining)} to go")
                        done += 1
                        meantime = (meantime+(end-start))/done
            print(f"sessions finished. meantime is {meantime}s")
    elif command == "list":
        while True:
            énoncés = list(formules.keys())
            shuffle(énoncés)
            print("\n".join(énoncés))
            input("anoda one?")
    else:
        print("unknown command.")
        exit(1)
