import operator
import re

from argenta import App, Orchestrator, Response, Router
from argenta.app import DynamicDividingLine
from argenta.command import Command, Flag, Flags
from argenta.response.status import ResponseStatus

router = Router("Calculator")

operations = {"mul": operator.mul, "sub": operator.sub, "add": operator.add}


@router.command(
    Command(
        "calc",
        description="Calculator with two numbers",
        flags=Flags(
            [
                Flag("a", possible_values=re.compile(r"^\d{,5}$")),  # First number
                Flag("b", possible_values=re.compile(r"^\d{,5}$")),  # Second number
                Flag(
                    "operation", possible_values=["add", "sub", "mul"]
                ),  # Operation: add, sub, mul
            ]
        ),
    )
)
def calc_handler(response: Response):
    # Get flag values
    a_flag = response.input_flags.get_flag_by_name("a")
    b_flag = response.input_flags.get_flag_by_name("b")
    op_flag = response.input_flags.get_flag_by_name("op")

    # Check that all flags are provided
    if response.status != ResponseStatus.ALL_FLAGS_VALID or not all([a_flag, b_flag, op_flag]):
        print("Error: must specify --a, --b and --op")
        return

    a = float(a_flag.input_value)
    b = float(b_flag.input_value)
    operation = op_flag.input_value

    try:
        result = operations[operation](a, b)
    except ZeroDivisionError:
        print("Can't divide by zero")
    else:
        print(f"Result: {result}")


app = App(
    initial_message="Calculator",
    repeat_command_groups_printing=False,
    prompt=">> ",
    dividing_line=DynamicDividingLine("~"),
)
orchestrator = Orchestrator()


def main():
    app.include_router(router)
    orchestrator.run_repl(app)


if __name__ == "__main__":
    main()
