#! /usr/bin/env python

"""Update one or more bugs"""

import buglib
import login
import sfdb

import getopt
import sys

# flags: do we use each of the following?
LOCAL_DATABASE = 1
SOURCEFORGE = 1
VERBOSE = 0
LOGIN = None
PASSWORD = None

FIELDS = ("summary", "bug_group_id", "category_id", "resolution_id",
          "status_id", "assigned_to", "priority", "details")
argnames = {}
for field in FIELDS:
    argnames['--' + field] = field

def main(bug_ids, updates):
    """Update one or more bugs using the fields in udpates

    bug_ids -- list of SF bug_ids
    updates -- keys are SF field names, values are the strings to put
        there
    """
    bug_ids = [int(bug) for bug in bug_ids]
    session = login.Login(LOGIN, PASSWORD)
    db = sfdb.BugDBInterface()
    update_ids = translate_updates(db, updates)
    
    for bug in bug_ids:
        b = db.get(bug)
        for k, v in update_ids.items():
            if k == 'assigned_to':
                b.assign(v)
            else:
                b.set(k, v)
        b.flush()
        buglib.update_bug(b.get_form_data(), session)
        if VERBOSE:
            print bug

def translate_updates(db, updates):
    trans = {}
    for k, v in updates.items():
        if k in ('summary', 'assigned_to', 'details'):
            trans[k] = v
            continue
        table = k[:-3]
        mapping = getattr(db, table)
        trans[k] = mapping.lookup(v)
    if VERBOSE:
        print trans
    return trans

if __name__ == "__main__":
    field_args = [field + "=" for field in FIELDS]
    opts, args = getopt.getopt(sys.argv[1:], 'v',
                               ["verbose", "login=", "password="] \
                               + field_args)
    updates = {}
    for k, v in opts:
        if k in ('-v', '--verbose'):
            VERBOSE = 1
        elif argnames.has_key(k):
            updates[argnames[k]] = v
        elif k == '--login':
            LOGIN = v
        elif k == '--password':
            PASSWORD = v

    assert len(args) > 0, "Must specify at least one bug id"
    if LOGIN is None:
        LOGIN = raw_input("SF username: ")
    if PASSWORD is None:
        import getpass
        PASSWORD = getpass.getpass("SF Password: ")
        
    main(args, updates)
