#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2007 Canonical Ltd., Daniel Holbach
# Copyright (C) 2008 Jonathan Patrick Davies <jpds@ubuntu.com>
#
# ##################################################################
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# See file /usr/share/common-licenses/GPL-3 for more details.
#
# ##################################################################
#
#
# hugdaylist - produces MoinMoin wiki formatted tables based on a Launchpad bug
#              list.
#
# hugdaylist <url>
# - produces lists like https://wiki.ubuntu.com/UbuntuBugDay/20070912?action=raw
#
# hugdaylist -n <howmany> <url>
# - will only list <howmany> URLs.

import sys
from optparse import OptionParser

from launchpadlib.launchpad import Launchpad

from ubuntutools.lp.libsupport import translate_web_api


def check_args():
    howmany = -1
    url = ""

    # Our usage options.
    usage = "usage: %prog [-n <number>] launchpad-buglist-url"
    opt_parser = OptionParser(usage)

    # Options - namely just the number of bugs to output.
    opt_parser.add_option("-n", "--number", type="int",
                          dest="number", help="Number of entries to output.")

    # Parse arguments.
    (options, args) = opt_parser.parse_args()

    # Check if we want a number other than the default.
    howmany = options.number

    # Check that we have an URL.
    if not args:
        print("An URL pointing to a Launchpad bug list is required.",
              file=sys.stderr)
        opt_parser.print_help()
        sys.exit(1)
    else:
        url = args[0]

    return (howmany, url)


def filter_unsolved(task):
    # TODO: don't use this filter here, only check status and assignee of
    #   the given task
    # Filter out special types of bugs:
    # - https://wiki.ubuntu.com/Bugs/HowToTriage#Special%20types%20of%20bugs
    # this is expensive, parse name out of self_link instead?
    subscriptions = set(s.person.name for s in task.bug.subscriptions)
    if (task.status != "Fix Committed" and
            (not task.assignee or task.assignee.name in ['motu', 'desktop-bugs']) and
            'ubuntu-sponsors' not in subscriptions and
            'ubuntu-archive' not in subscriptions):
        return True
    return False


def main():
    (howmany, url) = check_args()
    if len(url.split("?", 1)) == 2:
        # search options not supported, because there is no mapping web ui
        # options <-> API options
        print("Options in url are not supported, url: %s" % url,
              file=sys.stderr)
        sys.exit(1)

    launchpad = None
    try:
        launchpad = Launchpad.login_with("ubuntu-dev-tools", 'production')
    except IOError as error:
        print(error)
        sys.exit(1)

    api_url = translate_web_api(url, launchpad)
    try:
        product = launchpad.load(api_url)
    except Exception as error:
        response = getattr(error, "response", {})
        if response.get("status", None) == "404":
            print(("The URL at '%s' does not appear to be a valid url to a "
                   "product") % url, file=sys.stderr)
            sys.exit(1)
        else:
            raise

    bug_list = [b for b in product.searchTasks() if filter_unsolved(b)]

    if not bug_list:
        print("Bug list of %s is empty." % url)
        sys.exit(0)
    if howmany == -1:
        howmany = len(bug_list)

    print("""
## ||<rowbgcolor="#CCFFCC"> This task is done || somebody || ||
## ||<rowbgcolor="#FFFFCC"> This task is assigned || somebody || <status> ||
## ||<rowbgcolor="#FFEBBB"> This task isn't || ... || ||
## ||<rowbgcolor="#FFCCCC"> This task is blocked on something || somebody || <explanation> ||

|| Bug || Subject || Triager ||""")

    for i in list(bug_list)[:howmany]:
        bug = i.bug
        print('||<rowbgcolor="#FFEBBB"> [%s %s] || %s || ||'
              % (bug.web_link, bug.id, bug.title))


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("Aborted.", file=sys.stderr)
        sys.exit(1)