#!/usr/bin/env python

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

import sys

try:
    from commandLine import commandLine
    from infoFiles import InfoFiles
    from HTMLOperations import BugList, Bug
    import utils
    import config
    import bzrutils
    import output
except:
    from bugHelper.commandLine import commandLine
    from bugHelper.infoFiles import InfoFiles
    import bugHelper.config as config
    import bugHelper.bzrutils as bzrutils
    import bugHelper.output as output
    from launchpadBugs.HTMLOperations import BugList, Bug
    import launchpadBugs.utils as utils

def main():
    conf = config.Config("~/.bughelper/config")
    cl = commandLine()
    if cl.options.gen_config:
        sys.exit(0)

    bzrutils.update_packages_data(conf.packages_dir, conf.update_interval)
    if not cl.options.try_only_clue:
        files = InfoFiles(set((conf.packages_dir, conf.local_packages_dir)))
    else:
        files = InfoFiles(set())
        files.add_simple_clue(cl.options.try_only_clue[0], 
                              cl.options.try_only_clue[1],
                              cl.options.try_only_clue[2])
    if cl.options.try_clue:
        # load existing clues first
        files.get_info_file(cl.options.try_clue[0], cl.options.verbose)
        files.add_simple_clue(cl.options.try_clue[0], 
                              cl.options.try_clue[1],
                              cl.options.try_clue[2])
    if not cl.options.url:
        if not cl.options.sourcepackage:
            cl.parser.print_usage()
            sys.exit(1)

        if not utils.package_exists(cl.options.sourcepackage):
            print "Package '%s' not found." % cl.options.sourcepackage
            sys.exit(1)
    
        if cl.options.sourcepackage:
          cl.options.url = \
            "https://bugs.launchpad.net/distros/ubuntu/+source/%s/+bugs" % \
                cl.options.sourcepackage

    bl = BugList(cl.options).bugs
    if not bl:
        print "No bugs found."
        sys.exit(1)
    for bugNum in bl:
        if not cl.options.attachments:
            b = Bug(bugNum, cl.options.sourcepackage, None)
        else:
            b = Bug(bugNum, cl.options.sourcepackage, conf.attachments_cache)
        displayclues = dict()
        info_file = files.get_info_file(b.sourcepackage, cl.options.verbose)
	if not str(bugNum) in info_file.dontlist:
	    collected_clues = set()
            if cl.options.heuristic and (not b.sourcepackage or \
                                         not info_file.clues):
                all_files = files.get_available_clue_files()
                for f in all_files:
	            info_file = files.get_info_file(b.sourcepackage, \
                                                    cl.options.verbose)
                    collected_clues.update(info_file.clues)
                    collected_clues.update(info_file.inherited_clues)
            if info_file.clues:
                collected_clues.update(info_file.clues)
                collected_clues.update(info_file.inherited_clues)
                for clue in collected_clues:
                    if info_file.clue_matches(clue, b.text, 
                                              cl.options.case_sensitive):
                        displayclues[clue.info] = set()
                    for a in b.attachments:
                        if info_file.clue_matches(clue, a.text):
                            if not displayclues.has_key(clue.info):
                                displayclues[clue.info] = set()
                            displayclues[clue.info].add(a.url)
                if displayclues:
                    print output.print_bug(cl.options.format, b, displayclues)

if __name__ == "__main__":
    main()

