#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function, unicode_literals

import argparse
import os
import sys

from requests import Session
from requests.adapters import HTTPAdapter
from urllib3.util import Retry


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--aptly-url', help="Base URL for aptly")
    parser.add_argument('--repo', help="Which repo to upload files into")
    parser.add_argument('--series', default='trusty', help="Which series to publish, after uploading files")
    parser.add_argument('--retries', action='store', default=0, type=int, help="How many times to retry if we get server errors")
    parser.add_argument('debs', nargs='+', type=argparse.FileType(mode='rb'), help="The deb file(s) to upload to aptly")
    args = parser.parse_args()

    username = os.environ['APTLY_UNAME']
    password = os.environ['APTLY_PASSWD']

    session = Session()
    session.auth = (username, password)

    if args.retries:
        retries = Retry(total=args.retries, status_forcelist=list(range(500, 600)))
        session.mount(args.aptly_url, HTTPAdapter(max_retries=retries))

    for deb in args.debs:
        basename = os.path.basename(deb.name)
        package_name = basename.split('_')[0]

        if not basename.endswith('.deb'):
            raise ValueError("Filename must end with .deb")
        if not package_name:
            raise ValueError("Filename must refer to a debian package")

        print("Uploading %s" % basename, file=sys.stderr)

        # Upload file
        url = '%s/api/files/%s' % (args.aptly_url, package_name)
        r = session.post(url, files={basename: deb})
        r.raise_for_status()

        # Copy uploaded file to repo
        url = '%s/api/repos/%s/file/%s/%s' % (args.aptly_url, args.repo, package_name, basename)
        r = session.post(url, data={})
        r.raise_for_status()

    # Tell repo to refresh and publish latest uploads
    print("Publishing repo", file=sys.stderr)
    url = '%s/api/publish/%s/%s' % (args.aptly_url, args.repo, args.series)
    r = session.put(url, data='{}', headers={'Content-Type': 'application/json'})
    r.raise_for_status()


if __name__ == '__main__':
    main()
