#!/usr/bin/python

# mailbox_iistore_delivered_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--
#       November 3, 2006        bar
#       November 6, 2006        bar     show already known ones if show_info > 1
#       May 28, 2007            bar     show already known name more liberally
#       May 30, 2007            bar     ah, make that require another show_info
#       July 11, 2007           bar     server not on line check
#       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_delivered_to
#
#
#       Run through a mailbox file, updating the IIstore knowledge of the Delivered-to's.
#
#


import  IIstoreClient
import  mailheader_really_delivered_to
import  mailheader_unknown_delivered_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

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

    what            = "unk"


    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()



    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_unknown_delivered_to.OUR_HEADER)
            if  len(hdrs) != 1 :                                                                            # don't process emails that are already known to the IIstore

                hdrs    = tzemail.find_email_headers(email, mailheader_really_delivered_to.OUR_HEADER)
                if  len(hdrs) != 1 :                                                                        # but do process emails that are tagged with who they were delivered to
                    mailheader_really_delivered_to.find_and_apply_header(email)
                    hdrs    = tzemail.find_email_headers(email, mailheader_really_delivered_to.OUR_HEADER)

                if  len(hdrs) == 1 :                                                                        # process this email?
                    name    = hdrs[0].strip().lower()

                    if  not names.has_key(name) :                                                           # if we have not already done this one
                        names[name] = what

                        r   = clt.make_query(name)
                        if  r == "" :
                            clt.store_value(name, what)                                                     # remember this guy
                            if  show_info != 0 :
                                print name, "is now", what
                        elif r == None :
                            print "Server not on line?"
                        elif (show_info > 2) or ((show_info > 1) and (r != what)) :
                            print name, "already known as", r
                        pass
                    pass
                elif  show_info > 1 :
                    print "Cannot find delivered-to in", email[0]
                pass
            elif show_info > 2 :
                print hdrs[0], "in email already"
            pass
        pass

    pass

#
#
#
# eof
