#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Copyright © 2009 James Westby <james.westby@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; either version 2
# of the License, or (at your option) any later version.
#
# 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.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# ##################################################################

from optparse import OptionParser
import re
import SOAPpy
import sys
import subprocess
from ubuntutools.lp.libsupport import (get_launchpad, translate_api_web)

bug_re = re.compile(r"bug=(\d+)")

url = 'http://bugs.debian.org/cgi-bin/soap.cgi'
namespace = 'Debbugs/SOAP'
debbugs = SOAPpy.SOAPProxy(url, namespace)

# debug
#debbugs.config.dumpSOAPOut = 1
#debbugs.config.dumpSOAPIn = 1

parser = OptionParser(usage="%prog [option] bug ...")
parser.add_option("-n", "--dry-run",
        help="Use the staging server so that changes are not permanent",
        dest="dry_run", action="store_true")
parser.add_option("-b", "--browserless",
        help="Don't open the bug in the browser at the end",
        dest="browserless", action="store_true")
(options, args) = parser.parse_args()

if options.dry_run:
    lp_server = 'staging'
else:
    lp_server = 'production'

try:
    lp = get_launchpad("ubuntu-dev-tools", lp_server)
except IOError, msg:
    print msg
    print "No credentials, can't continue"
    sys.exit(1)

debian = lp.distributions['debian']
ubuntu = lp.distributions['ubuntu']
lp_debbugs = lp.bug_trackers.getByName(name='debbugs')

bug_nums = []

for bug_num in args:
    if bug_num.startswith("http"):
        # bug URL
        match = bug_re.search(bug_num)
        if match is None:
            raise ValueError("Can't determine bug number from %s" % bug_num)
        bug_num = match.groups()[0]
    bug_num = bug_num.lstrip("#")
    bug_num = int(bug_num)
    bug_nums.append(bug_num)

bugs = debbugs.get_status(*bug_nums)

if len(bug_nums) > 1:
    bugs = bugs[0]

#import pdb; pdb.set_trace()
for bug in bugs:
    bug = bug.value
    package = bug.package
    bug_num = bug.bug_num
    subject = bug.subject
    log = debbugs.get_bug_log(bug_num)
    summary = log[0][0]
    target = ubuntu.getSourcePackage(name=package)
    u_bug = lp.bugs.createBug(target=target, title=subject,
            description="Imported from Debian bug %d:\n\n%s"
                % (bug_num, summary))
    d_task = u_bug.addTask(target=debian.getSourcePackage(name=package))
    d_watch = u_bug.addWatch(remote_bug=bug_num, bug_tracker=lp_debbugs)
    d_task.bug_watch = d_watch
    d_task.lp_save()
    web_url = translate_api_web(u_bug.self_link)
    print "Opened %s" % web_url
    if not options.browserless:
        subprocess.call(["xdg-open", web_url])

#def get_status(*args):
#    result = server.get_status(*args)
#    return result
#
#def get_bugs(*args):
#    result = server.get_bugs(*args)
#    return result
#
#def get_usertag(email, *tags):
#    result = server.get_usertag(email, *tags)
#    return result
#
#def get_bug_log(bugnumber):
#    result = server.get_bug_log(bugnumber)
#    return result
#
#def newest_bugs(amount):
#    result = server.newest_bugs(amount)
#    return result
#
#if __name__ == "__main__":
#    # Demonstration
#
#    # some debug output
#
#    # All bugs from one package (returns a list of bugnumbers)
#    print get_bugs("package", "gtk-qt-engine")
#
#    # All bugs of a maintainer
#    print get_bugs("maint", "debian-qa@lists.debian.org")
#
#    # returns the status of those bugs
#    print get_status(409909, 419920, 421581, 417044, 397993)
#
#    # get_status and get_bugs combined:
#    print get_status(get_bugs("package", "gtk-qt-engine"))
#
#    # returns the full log for the given bug number
#    print get_bug_log(202526)
#
#    # retrives the newest 20 bugs
#    print newest_bugs(20)
#
#    # All bugs of a maintainer
#    print get_bugs("maint", "debian-qa@lists.debian.org")
#
#    # returns the status of those bugs
#    print get_status(409909, 419920, 421581, 417044, 397993)
#
#    # get_status and get_bugs combined:
#    print get_status(get_bugs("package", "gtk-qt-engine"))
#
#    # returns the full log for the given bug number
#    print get_bug_log(202526)
#
#    # retrives the newest 20 bugs
#    print newest_bugs(20)
#
#    # returns bugs tagged by the given email
#    print get_usertag("debian-qa@lists.debian.org")
#
#    # returns bugs tagged by the given email, with the given tag
#    print get_usertag("debian-qa@lists.debian.org", "qa-ftbfs-20070708")
#