#!/usr/bin/python
# Request re-runs of autopkgtests for packages

import os
import sys
import argparse
import json

import kombu

my_dir = os.path.dirname(os.path.realpath(sys.argv[0]))


def parse_args():
    '''Parse command line arguments'''

    parser = argparse.ArgumentParser()
    parser.add_argument('-c', '--config',
                        default=os.path.join(my_dir, 'britney.conf'),
                        help='britney config file (default: %(default)s)')
    parser.add_argument('-s', '--series', required=True,
                        help='Distro series name (required).')
    parser.add_argument('-a', '--architecture', action='append', default=[],
                        help='Only run test(s) on given architecture name(s). '
                        'Can be specified multiple times (default: all).')
    parser.add_argument('--trigger', action='append', default=[],
                        help='Add triggering package to request. '
                        'Can be specified multiple times.')
    parser.add_argument('package', nargs='+',
                        help='Source package name(s) whose tests to run.')
    return parser.parse_args()


def parse_config(config_file):
    '''Parse config file (like britney.py)'''

    config = argparse.Namespace()
    with open(config_file) as f:
        for k, v in [r.split('=', 1) for r in f if '=' in r and not r.strip().startswith('#')]:
            k = k.strip()
            if not getattr(config, k.lower(), None):
                setattr(config, k.lower(), v.strip())
    return config


if __name__ == '__main__':
    args = parse_args()
    config = parse_config(args.config)
    if not args.architecture:
        args.architecture = config.adt_arches.split()

    if args.trigger:
        params = '\n' + json.dumps({'triggers': args.trigger})
    else:
        params = ''

    with kombu.Connection(config.adt_amqp) as conn:
        for arch in args.architecture:
            # don't use SimpleQueue here as it always declares queues;
            # ACLs might not allow that
            with kombu.Producer(conn, routing_key='debci-%s-%s' % (args.series, arch),
                                auto_declare=False) as p:
                for pkg in args.package:
                    p.publish(pkg + params)