#!/usr/bin/python

# mailbox_iistore_bogus_to.py
#       --copyright--                   Copyright 2007 (C) Tranzoa, Co. All rights reserved.    Warranty: You're free and on your own here. This code is not necessarily up-to-date or of public quality.
#       --url--                         http://www.tranzoa.net/tzpython/
#       --email--                       pycode is the name to send to. tranzoa.com is the place to send to.
#       --bodstamps--
#       May 28, 2007
#       May 28, 2007        bar     require an extra show_info for most such output
#       May 29, 2007        bar     do 'em sorted
#                                   only_allow_hosts
#       November 18, 2007       bar     turn on doxygen
#       November 27, 2007       bar     insert boilerplate copyright
#       May 17, 2008            bar     email adr
#       May 27, 2012            bar     doxygen namespace
#       --eodstamps--
##      \file
#       \namespace              tzpython.mailbox_iistore_bogus_to
#
#
#       Run through a mailbox file, updating the IIstore knowledge of the bogus To's.
#
#


import  IIstoreClient
import  mailheader_bogus_to
import  tzemail


#
#
#
if __name__ == '__main__' :

    import  sys

    import  tzlib
    import  TZCommandLineAtFile


    del sys.argv[0]

    TZCommandLineAtFile.expand_at_sign_command_line_files(sys.argv)

    show_info           = 0

    only_allow_hosts    = []

    host                = None
    port                = None
    user_name           = None
    password            = None
    iiname              = None
    precedent_str       = None
    timeout             = 5.0

    what                = "bogus_to"
    force               = False



    while True :
        oi  = tzlib.array_find(sys.argv, [ "--show_info", "-i" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        show_info  += 1

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--host", "-h" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        host        = sys.argv.pop(oi)

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--port", "-p" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        port        = int(sys.argv.pop(oi))

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--user", "-u" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        user_name   = sys.argv.pop(oi)

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--password", "-a" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        password    = sys.argv.pop(oi)

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--iiname", "-i" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        iiname      = sys.argv.pop(oi)

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--prec_str", "-s" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        precedent_str   = sys.argv.pop(oi)

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--timeout", "-t" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        timeout         = float(sys.argv.pop(oi))


    while True :
        oi  = tzlib.array_find(sys.argv, [ "--what", "-w" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        what            = sys.argv.pop(oi).strip()

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--force", "-f" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        what            = sys.argv.pop(oi).strip()
        force           = True

    while True :
        oi  = tzlib.array_find(sys.argv, [ "--only", "-o" ])
        if  oi < 0 :    break
        del sys.argv[oi]
        only_allow_hosts.append(sys.argv.pop(oi).lower())





    if  len(sys.argv) != 1 :
        print   sys.argv
        print   "Just tell me an input. Nothing more."
        sys.exit(101)


    fname   = sys.argv.pop(0)

    if  show_info != 0 :
        print "Doing", fname

    emails  = tzemail.read_mbox_file(fname)

    names   = []

    if  len(emails) == 0 :
        print "No emails to process in", fname
    else :
        clt     = IIstoreClient.an_iistore_client(host, port, user_name, password, iiname, precedent_str, timeout)
        if  not clt :
            raise "Cannot make a new IIstore client!"
        clt.screen_info = (show_info > 2)

        for email in emails :
            hdrs    = tzemail.find_email_headers(    email, mailheader_bogus_to.OUR_HEADER)
            if  len(hdrs)  == 0 :                                                                           # don't process emails that are already known to the IIstore

                names      += mailheader_bogus_to.make_names_from_hdrs(email, only_allow_hosts)
            elif show_info > 2 :
                print hdrs[0], "in email already"
            pass
        pass

        names   = tzlib.make_dictionary(names).keys()
        names.sort()

        for name in names :
            r   = clt.make_query(name)
            if  (not r) or (force and (r != what)) :
                clt.store_value(name, what)                                                                 # remember this guy
                if  show_info != 0 :
                    print name, "is now", what
                pass
            elif (show_info > 2) or ((show_info > 1) and (r != what)) :                                     # change the second > 1 to see names that aren't changed unless forced
                print name, "already known as", r
            pass
        pass
    pass

#
#
#
# eof
