#!/usr/bin/python3
import logging

import argcomplete.completers

import mini_buildd.cli
import mini_buildd.client
import mini_buildd.events
import mini_buildd.changes

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(mini_buildd.cli.CLI):
    def __init__(self):
        self.default_dputcf = mini_buildd.cli.DputCf()

        super().__init__("mini-buildd-dput", DESCRIPTION)
        self.parser.add_argument("-c", "--config", action="store", default=self.default_dputcf.config, 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 = mini_buildd.cli.DputCf(self.args.config)
        upload = mini_buildd.changes.Base(self.args.changes)
        endpoint = mini_buildd.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 = mini_buildd.client.Client(dputcf.get_target_http_url(self.args.target)).event(types=[mini_buildd.events.Type.INSTALLED, mini_buildd.events.Type.FAILED],
                                                                                                  source=upload["Source"], version=upload["Version"], distribution=upload["Distribution"],
                                                                                                  after=pre_upload_timestamp)
            if event.type == mini_buildd.events.Type.FAILED:
                raise Exception(event)
            print(event)


CLI().run()
