#!/opt/osstech/bin/python2.7
# -*- coding: utf-8 -*-

# googleapps-nickname-csvadd.py 
# - Nickname create to Google Apps by reading CSV file
#
# Copyright (C) TAKEDA Yasuma @ Open Source Solution Technology Co. Ltd.
# License: GNU General Public License version 2 or later
# Date: 2009-07-28

import os, sys, csv, datetime, getopt, string

# from Google
import gdata.apps.service
import gdata.apps.emailsettings.service

# from OSSTech
import googleappsutils.domain


# Command Option
# -d domain name of Google Apps(Must)
# -f csv file(Must)
# -l directory of result file
# -s directory of summary file

# CSV Format
# This file must be UTF-8 encoding.
# |username|nickname|
# |user1   |yasuma  |
# |user2   |take    |


def usage():
    sys.stderr.write("Usage:" + sys.argv[0] + " -d domain -f csvfile [-l resultfile] [-s summaryfile]\n")
    sys.exit(1)

def isYes(str):
    if string.upper(str) == "YES":
        return True
    return False

def main():
    domain = None
    csvfile = None
    resultfile = None
    summaryfile = None
    # Parse option
    try:
        (opts, args) = getopt.getopt(sys.argv[1:], "d:f:l:s:")
    except getopt.GetoptError:
        sys.stderr.write("Error : Invalid Option\n")
        usage()

    for (opt, value) in opts:
        if opt == "-d":
            domain = value
        if opt == "-f":
            csvfile = value
        if opt == "-l":
            resultfile = value
        if opt == "-s":
            summaryfile = value

    if domain == None or csvfile == None:
        usage()

    # try to open csv file.
    try:
        csvFd = open(csvfile, 'r')
    except Exception, e:
        sys.stderr.write("Error : Failed to open csvfile.\n")
        sys.stderr.write(str(e) + "\n")
        sys.exit(1)

    # Read Configuration
    gDomain = googleappsutils.domain.Domain()
    try:
        gDomain.readConfig(domain)
    except Exception, e:
        sys.stderr.write("Error : Invalid configuration [" + domain + "]\n")
        sys.stderr.write(str(e))
        sys.exit(1)

    # Setup result files
    type = "nicknameadd"
    now = datetime.datetime.now()    
    baseFileName = gDomain.getBaseFilename(now, type, domain)
    if resultfile == None:
        resultfile = gDomain.resultDir + baseFileName + "-result.csv"
    if summaryfile == None:
        summaryfile = gDomain.summaryDir + baseFileName + ".summary"

    try:
        resultFd = open(resultfile, "w")
        summaryFd = open(summaryfile, "w")
    except Exception, e:
        sys.stderr.write("Error : Failed to open file.\n")
        sys.stderr.write(str(e))
        sys.exit(1)

    # Read entries from csv file
    try:
        reader = csv.reader(csvFd)
    except Exception , e:
        sys.stderr.write("Error : Failed to read entry from csv file.\n")
        sys.stderr.write(str(e)+"\n")
        sys.exit(1)
    
    # Connect to Google Apps
    try:
        service = gdata.apps.service.AppsService(gDomain.admin,gDomain.adminPass, gDomain.domain)
        service.ProgrammaticLogin()
        emailsettings = gdata.apps.emailsettings.service.EmailSettingsService(gDomain.admin, gDomain.adminPass,gDomain.domain)
        emailsettings.ProgrammaticLogin()
    except Exception, e:
        sys.stderr.write("Error : Failed to connect to Google Apps.\n" + str(e) + "\n")
        sys.exit(1)

    # Handle each entries
    r = 0 # counter of row. 0 is header
    header = []
    error = 0
    success = 0
    for row in reader:
        username = None
        if len(row) == 0:
            continue

        if r == 0:
            # Create header list
            for key in row:
                header.append(key)
            # Check nickname is included in headerAttrs.
            headerAttrs = set(header)
            if ("nickname" not in headerAttrs):
                sys.stderr.write("Error : Invalid csv format.\n")
                sys.exit(1)
        else:
            # Create user entry
            attrs = {}
            n = 0
            for value in row:
                if n == 0:
                    username = value
                else:
                    attrs[header[n]] = value
                n = n + 1

            # Check nickname is included in attrs.
            if (not attrs.has_key("nickname")):
                errormsg = username + ",nickname are missing\n"
                sys.stderr.write(errormsg)
                resultFd.write(errormsg)
                continue
            
            nickname = attrs["nickname"]

            # Check ignore user or not
            if gDomain.isIgnoreUsers(username):
                continue

            # Add nickname to Google Apps
            try:
                service.CreateNickname(username, nickname)
            except gdata.apps.service.AppsForYourDomainException, e:
                errormsg = username + "," + gDomain.errorstr(e) + "\n"
                sys.stderr.write(errormsg)
                resultFd.write(errormsg)
                error = error + 1
            except Exception , e:
                errormsg = username + "," + '"' + str(e) + '"' + "\n"
                sys.stderr.write(errormsg)
                resultFd.write(errormsg)
                error = error + 1
            else:
                msg = username + ",OK\n"
                sys.stdout.write(msg)
                resultFd.write(msg)
                success = success + 1

        resultFd.flush()
        r = r + 1  # Increment row counter
                 

    # Create summary 
    msg = str((r-1)) + " user entries are handled.\n"
    summaryFd.write(msg)
    msg = "Success to add:" + str(success) + " user entries\n"
    summaryFd.write(msg)
    msg = "Fail to add:" + str(error) + " user entries\n"
    summaryFd.write(msg)

    resultFd.close()
    summaryFd.close()
    sys.exit(0)

main()
