#!/usr/bin/env python

# Written by Henrik Nilsen Omma
# (C) Canonical, Ltd. Licensed under the GPL

import os
import sys
import string
import urllib
import re
import time

try:
    import connector as Connector
    import commandLine
    import config
    import utils
    import output
    import statistic
except:
    from bugHelper.commandLine import commandLine
    from launchpadbugs.html_buglist import sort
    import launchpadbugs.connector as Connector
    import bugHelper.utils as utils
    import bugHelper.config as config
    import bugHelper.output as output
    import bugHelper.statistic as statistic

def main():
    conf = config.Config("~/.bughelper/config")
    cl = commandLine()
    
    Bug = Connector.ConnectBug()
    BugList = Connector.ConnectBugList()
    cookie = None
    try:
        cookie = cl.options.cookie
    except:
        try:
            cookie = os.path.expanduser(config.cookie)
        except:
            print >> sys.stderr, "No cookie-file found"
    if cookie:
        BugList.authentication=cookie
        Bug.authentication=cookie
        
    try:
        out = output.Output("bugnumbers",cl.options.format,cl.options.file)
    except output.StyleNotFound, e:
        print >> sys.stderr, e
        sys.exit(1)
    out.print_header()
    start = time.time()
    BugList.set_filter(**vars(cl.options))

    if not cl.options.url:
        if not cl.options.sourcepackage:
            cl.parser.print_usage()
            sys.exit(1)
                
        cl.options.url = \
                "https://bugs.launchpad.net/ubuntu/+source/%s/+bugs?%s" % \
                    (cl.options.sourcepackage, BugList.urlopt)
    else:
        try:
            cl.options.url = BugList.get_modified_url(cl.options.ignore_conflicts)
        except ValueError, e:
            print >> sys.stderr, e
            sys.exit(1)

    if cl.options.no_duplicates:
        m = re.search('^(<|>){0,1}([0-9]+$)', cl.options.no_duplicates)
        if not m:
            cl.parser.print_usage()
            sys.exit(1)
        if m.group(1) == "<" :
            no_duplicates = lambda x: x < int(m.group(2))
        elif m.group(1) == ">" :
            no_duplicates = lambda x: x > int(m.group(2))
        else:
            no_duplicates = lambda x: x == int(m.group(2))

    try:
        bl = BugList(cl.options.url)
    except BugList.Error.LPUrlError, e:
        x = " Maybe package '%s' does not exist in ubuntu." %cl.options.sourcepackage if cl.options.sourcepackage else ""
        print >> sys.stderr, "Error while parsing '%s': %s.%s" %(cl.options.url, e, x)
        sys.exit(1)
        
    if cl.options.upstream and cl.options.sourcepackage:
            l = None
            try:
                l = BugList("http://launchpad.net/%s/+bugs?%s" % (cl.options.sourcepackage, BugList.urlopt))
            except BugList.Error.LPUrlError, e:
                print >> sys.stderr, "There is no product <%s> in launchpad.net" %cl.options.sourcepackage
            if l:
                bl += l
            
    if cl.options.sourcepackage:
        path = os.path.expanduser(os.path.join(conf.attachments_cache, 
                                               cl.options.sourcepackage))
        utils.remove_obsolete_attachments(path, bl.bugs)
    all_bugs = bl.filter().bugs
    bugs_dict = {}
    if cl.options.no_duplicates:
        rm_bugs = set()
        for x in all_bugs:
            bugs_dict[x] = Bug(x)
            if not no_duplicates(len(bugs_dict[x].duplicates)):
                rm_bugs.add(x)
        all_bugs = all_bugs.difference(rm_bugs)

    if not all_bugs:
        out.info("No bugs found.")
        sys.exit(1)
    elif cl.options.count:
        for x in all_bugs:
            if x not in bugs_dict:
                bugs_dict[x] = Bug(x)
            comments = bugs_dict[x].comments
            out.print_item({"bug" : x, "count" : len(comments)},"comments")
    elif cl.options.stats:
        out.print_item(statistic.summary(all_bugs),"statistic")
    else:
        if cl.options.sort:
            bug_list = []
            for bi in all_bugs:
                bug_list.append(bi)
            bug_list.sort(lambda x, y: sort(x,y,cl.options.sort))
            for bi in bug_list:
                out.print_item({"bug" :bi})
        else:
            for bi in all_bugs:
                out.print_item({"bug" :bi})

    footer_opt = {}
    if cl.options.footer:
        o = list(cl.options.footer)
        if "s" in o:
            footer_opt["statistic"] = statistic.summary(all_bugs)
        if "t" in o:
            footer_opt["time"] = {
                "time": time.strftime("%a, %d %b %Y %H:%M:%S %Z"),
                "duration" : "%i" %(time.time() - start)}
    out.print_footer(footer_opt)
        

if __name__ == "__main__":
    main()

