import os
from typing import List
import subprocess
import requests


def get_ex_rates() -> float:
    response = \
        requests.get("https://www.cbr-xml-daily.ru/daily_json.js").json()
    out = {}
    for valute in response["Valute"]:
        out[valute] = response["Valute"][valute]["Value"]
    return out


def show_command_out(command: str, return_out: str = True) -> str | None:
    if not return_out:
        os.system(command)
        return
    return subprocess.check_output(
        command,
        shell=True
    ).decode("utf-8")


def show_dmenu_out(question: str, answers: List[str] = None) -> str:
    if not answers:
        return show_command_out(
            'cat /dev/null | dmenu -p "{}"'.format(
                question
            )
        )[:-1]
    return show_command_out(
        'echo "{}" | dmenu -p "{}"'.format(
            "".join([f"{x}\n" for x in answers])[:-1],
            question
        )
    )[:-1]


def main() -> None:
    sentence = show_dmenu_out(">")
    try:
        ex_rates = get_ex_rates()
        for ex_rate in ex_rates:
            locals()[ex_rate] = ex_rates[ex_rate]
        answer = str(eval(sentence))
    except Exception as exc:
        answer = str(exc)
    do_copy = show_dmenu_out(f"{sentence} = {answer}", ["Exit", "Copy"])
    if do_copy == "Copy":
        show_command_out(
            f'echo "{answer}" | xclip -selection clipboard -r',
            False
        )


if __name__ == '__main__':
    main()