#!/usr/local/bin/python2.7

import sys, os
from MAPI import *
from MAPI.Util import *
import locale
locale.setlocale(locale.LC_CTYPE, '')

PR_EC_OUTOFOFFICE                   = PROP_TAG(PT_BOOLEAN,    PR_EC_BASE+0x60)
PR_EC_OUTOFOFFICE_MSG               = PROP_TAG(PT_TSTRING,    PR_EC_BASE+0x61)
PR_EC_OUTOFOFFICE_SUBJECT           = PROP_TAG(PT_TSTRING,    PR_EC_BASE+0x62)

MODE_ENABLE = 1
MODE_DISABLE = 2
MODE_UPDATE_ONLY = 3

if len(sys.argv) < 3:
    print "Usage: %s <username> <0|1|-> [<oof_subject>] [</path/to/oof/message.txt>]" % sys.argv[0]
    sys.exit(1)

def PrintSubject(subject):
    if subject.ulPropTag == PR_EC_OUTOFOFFICE_SUBJECT:
        print "Current subject: '%s'" % subject.Value
    else:
        print "No subject set"


if sys.argv[2] == '-':
    mode = MODE_UPDATE_ONLY
else:
    enabled = bool(int(sys.argv[2]))
    mode = {True: MODE_ENABLE,
            False: MODE_DISABLE}.get(enabled)

try:
    session = OpenECSession(sys.argv[1], '', os.getenv('ZARAFA_SOCKET','file:///var/run/zarafa'))
    st = GetDefaultStore(session)
except MAPIError, e:
    print "Unable to open store for user %s" % sys.argv[1]
    sys.exit(1)

props = st.GetProps([PR_EC_OUTOFOFFICE, PR_EC_OUTOFOFFICE_SUBJECT], 0)
if props[0].ulPropTag == PR_EC_OUTOFOFFICE:
    if props[0].Value == True and mode != MODE_DISABLE:
        print "Not changing subject and message for user %s which already has out of office message enbled." % sys.argv[1]
        PrintSubject(props[1])
        sys.exit(0)
    elif props[0].Value == False and mode == MODE_DISABLE:
        print "Out of office is already disabled for user %s" % sys.argv[1]
        sys.exit(0)

if mode != MODE_UPDATE_ONLY:
    st.SetProps([SPropValue(PR_EC_OUTOFOFFICE, enabled)])

if mode != MODE_DISABLE:
    if len(sys.argv) >= 4:
        st.SetProps([SPropValue(PR_EC_OUTOFOFFICE_SUBJECT, sys.argv[3])])

    if len(sys.argv) >= 5:
        f = open(sys.argv[4], 'rt')
        msg = f.read()
        st.SetProps([SPropValue(PR_EC_OUTOFOFFICE_MSG, msg)])
        f.close()

    if mode == MODE_ENABLE:
        print "Out of office enabled for user %s" % sys.argv[1]
    elif len(sys.argv) >=4:
        print "Out of office updated for user %s" % sys.argv[1]
    else:
        print "Out of user not updated for user %s" % sys.argv[1]
    props = st.GetProps([PR_EC_OUTOFOFFICE_SUBJECT], 0)
    PrintSubject(props[0])
else:
    print "Out of office disabled for user %s" % sys.argv[1]
