use argparse with subcommands to make argument parsing more robust and a lot shorter