#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# filter-packages: easily find and filter packages.yml
#
# Copyright © 2015 Chris Lamb <lamby@debian.org>
# Licensed under WTFPL — http://www.wtfpl.net/txt/copying/

import sys
import yaml
import random
import optparse

from os.path import join, dirname, abspath

SHOW = {
    'version': ' ',
    'comments': '\n',
}

def main():
    parser = optparse.OptionParser(usage='%prog [options] [packages.yml]')
    parser.add_option('--issues', dest='issues', default=None,
        help="only print packages with comma-separated issues ISSUES")
    parser.add_option('--without-issues', dest='without_issues', default=None,
        help="only print packages without comma-separated issues ISSUES")
    parser.add_option('--has-bugs', dest='bugs', action='store_true',
        help="only print packages with bug(s) listed")
    parser.add_option('--no-bugs', dest='bugs', action='store_false',
        help="only print packages without bug(s) listed")
    parser.add_option('--has-comments', dest='comments', action='store_true',
        help="only print packages with comments")
    parser.add_option('--no-comments', dest='comments', action='store_false',
        help="only print packages without comments")
    parser.add_option('--show', dest='show', choices=sorted(SHOW.keys()),
        help="print field")
    parser.add_option('--issues-exact', dest='issues_exact', action='store_true',
        help="match set of issues exactly")
    parser.add_option('--filter-ftbfs', dest='filter_ftbfs', action='store_true',
        help="only match ftbfs packages")
    parser.add_option('--random', dest='random', type=int, metavar='N',
        help="only print (at most) N random packages")
    parser.add_option('--url', dest='url', action='store_true',
        help="print url as well as the package name")

    options, args = parser.parse_args()

    if len(args) > 1:
        parser.error("command can only take one argument")

    if options.issues is not None:
        options.issues = set(x for x in options.issues.split(',') if x)

    if options.without_issues is not None:
        options.without_issues = set(options.without_issues.split(','))

    status = {}
    if options.filter_ftbfs:
        from rblib import remote
        status = remote.load_reproducible_status()

    filename = args[0] if len(args) == 1 else \
        join(dirname(dirname(abspath(__file__))), 'notes', 'packages.yml')

    with open(filename) as f:
        packages = yaml.safe_load(f)

    results = []
    for x, y in sorted(packages.items()):
        issues = set(y.get('issues', ()))

        if options.issues_exact and options.issues != issues:
            continue

        if options.issues is not None and not options.issues <= issues:
            continue

        if options.without_issues is not None and options.without_issues & issues:
            continue

        if options.bugs is not None and options.bugs ^ ('bugs' in y):
            continue

        if options.comments is not None and options.comments ^ ('comments' in y):
            continue

        if options.filter_ftbfs:
            if status.get(x, {}).get('status', None) != 'FTBFS':
                continue

        results.append((x, y))

    if options.random is not None:
        results = random.sample(results, min(options.random, len(results)))

    for x, y in results:
        print("".join((
            x,
            " <https://tests.reproducible-builds.org/{}>".format(x) \
                if options.url else '',
            SHOW.get(options.show, ''),
            y.get(options.show, ''),
        )))

    return 0

if __name__ == '__main__':
    sys.exit(main())
