#!/usr/bin/python3
import logging

import argcomplete.completers

from mini_buildd import util, net, client, events, changes, cli

LOG = logging.getLogger("mini_buildd")

#: Needed for man page hack in setup.py
DESCRIPTION = "Upload it like mini-buildd (unlike dput/dput-ng, supports ftps)"


class CLI(cli.CLI):
    def __init__(self):
        self.default_dputcf = cli.DputCf()  # Helper to get completion for the default config path

        super().__init__("mini-buildd-dput", DESCRIPTION)
        self.parser.add_argument("-c", "--config", action="store", default=cli.DputCf.DEFAULT_PATH, help="Configuration file to parse")
        self.parser.add_argument("-f", "--force", action="store_true", help="Disable check for unique upload")
        self.parser.add_argument("-C", "--check-result", action="store_true", help="Wait for and check packaging results (fails if package is not installed)")
        self.parser.add_argument("target", action="store", metavar="TARGET",
                                 help="dput target (configuration section id in .dput.cf)").completer = self.default_dputcf.target_completer
        self.parser.add_argument("changes", action="store", metavar="CHANGES",
                                 help="changes file").completer = argcomplete.completers.FilesCompleter([".changes"])

    def runcli(self):
        dputcf = cli.DputCf(self.args.config)
        upload = changes.Base(self.args.changes)
        endpoint = net.ClientEndpoint(dputcf.get_target_ftp_url(self.args.target))
        pre_upload_timestamp = upload.upload(endpoint, force=self.args.force)
        if self.args.check_result:
            event = client.Client(dputcf.get_target_http_url(self.args.target)).event(types=[events.Type.INSTALLED, events.Type.FAILED],
                                                                                      source=upload["Source"], version=upload["Version"], distribution=upload["Distribution"],
                                                                                      after=pre_upload_timestamp)
            if event.type == events.Type.FAILED:
                raise util.HTTPBadRequest(event)
            print(event)


if __name__ == "__main__":
    CLI().run()
