#!/usr/bin/python3
import logging

import mini_buildd.api
import mini_buildd.client
import mini_buildd.cli

LOG = logging.getLogger("mini_buildd")

#: Needed for man page hack in setup.py
DESCRIPTION = "Run API calls against a mini-buildd instance"


class CLI(mini_buildd.cli.CLI):
    def __init__(self):
        super().__init__("mini-buildd-api", DESCRIPTION,
                         "Note: Uses ``python3-keyring`` to persist passwords (see ``man 1 keyring``)")

        self.parser.add_argument("-J", "--json", action="store_true",
                                 help="use parsable json output")
        self.parser.add_argument("--auto-confirm", action="store_true",
                                 help="force-bypass extra confirmation (for confirmable calls)")
        self.parser.add_argument("--auto-save-passwords", action="store_true",
                                 help="don't ask before saving passwords (via python3-keyring)")

        # Unfortunately, we cannot group the calls (yet), see http://bugs.python.org/issue14037, https://bugs.python.org/issue9341
        self.subparsers = self.parser.add_subparsers(title="API calls (run 'mini-buildd-api <call> --help' for full single call help)",
                                                     required=True,
                                                     metavar="<call> [options]")

        for call, call_cls in mini_buildd.api.CALLS.items():
            call_parser = self._add_subparser(self.subparsers, call, call_cls.doc() + "\n.")
            self._add_endpoint(call_parser)
            for argument in call_cls.iarguments():
                call_parser.add_argument(*argument.id_list, **argument.argparse_kvsargs())
            call_parser.set_defaults(call=call_cls)

    def runcli(self):
        client = mini_buildd.client.Client(self.args.endpoint,
                                           auto_confirm=self.args.auto_confirm,
                                           auto_save_passwords=self.args.auto_save_passwords)
        call = self.args.call.from_sloppy_args(**vars(self.args))
        result = client.api(call)
        print(mini_buildd.api.Call.get_plain(result, force_json=self.args.json))


CLI().run()
