#!/usr/bin/python

import string, sys, time, codecs
import xmlrpclib as xmlrpclib
import strptime as strptime
from ConfigParser import ConfigParser
from exceptions import Exception
from pprint import pprint
from types import *
from copy import copy


class CP (ConfigParser):
   def __init__ (self, defaults = None):
      ConfigParser.__init__ (self, defaults)
   def optionxform (self, optionstr):
      return str (optionstr)


def persons ():
	print "*" * 60
	print "importing persons"
	print "*" * 60
	file = codecs.open (parser.get ('options', 'person_file'), 'r', 'iso-8859-1')

	line = file.readline ()
	print line
	if line != '':
		while line [-2] != '"' and line [-2] != ';':
			line = line + file.readline ()
	entry = line [:-1]
	while entry != '':
		entry = getFields (entry)
		status = entry [string.atoi (parser.get ('person_attributes', 'entry_status')) - 1]
		if status == 'new':
			entry = createPersonEntry (entry)
			del entry ['entry_status']
			person = insertPerson (entry)

		line = file.readline () [:-1]
		if line != '':
			while line [-2] != '"' and line [-2] != ';':
				line = line + file.readline ()
		entry = line [:-1]

def insertPerson (entry):
	print "|-> insertPerson (%s %s %s)" % (entry ['isAccount'], entry ['name'], entry ['firstname'])
        if entry ['isAccount'] != '1':

		try:
			person = server.person.insert (entry)
		except Exception,e :
			person = {}
		if not person:
			print "--- failed"
		else:
			print "+++ succeeded"
	else:
		person = {}
		print "is account: not inserted"
	return person

def createPersonEntry (entry):
	new_entry = {}
	if len (entry) > 0:
		fields = parser.options ('person_attributes')
		for field in fields:
			insertEntries (new_entry, field, field, entry, 'person_attributes')
	postProcessPerson (new_entry)
	return new_entry
	
def postProcessPerson (entry):
	attributes = ['id', 'phones', 'addresses', 'owner', 'salutation', 'extendedAttrs', 'birthday']
	phoneTypes = ['01_tel', '02_tel', '03_tel_funk', '05_tel_private', '10_fax', '15_fax_private']
	addressTypes = ['mailing', 'location', 'private']
	salutation =	{	'Ms.': ('01_dear_ms', 'female'),
							'Ms': ('01_dear_ms', 'female'),
							'Dear Ms.': ('01_dear_ms', 'female'),
							'Mrs.': ('02_dear_mrs', 'female'),
							'Mrs': ('02_dear_mrs', 'female'),
							'Dear Mrs.': ('02_dear_mrs', 'female'),
							'Mr.': ('03_dear_mr', 'female'),
							'Mr': ('03_dear_mr', 'female'),
							'Dear Mr.': ('03_dear_mr', 'male'),
							'Dear Prof.': ('04_dear_prof', 'male'),
							'Dear Dr.': ('04_dear_dr', 'male'),
							'Hr.': ('06_geehrt_herr', 'male'),
							'Herrn': ('06_geehrt_herr', 'male'),
							'Herr': ('06_geehrt_herr', 'male'),
							'Sehr geehrter Herr': ('06_geehrt_herr', 'male'),
							'Fr.': ('07_geehrt_frau', 'female'),
							'Frau': ('07_geehrt_frau', 'female'),
							'Sehr geehrte Frau': ('07_geehrt_frau', 'female'),
							'Sehr geehrter Herr Prof.': ('08_geehrt_herr_prof', 'male'),
							'Sehr geehrter Herr Dr.': ('09_geehrt_herr_dr', 'male'),
							'Sehr geehrte Frau Prof.': ('10_geehrt_frau_prof', 'female'),
							'Sehr geehrte Frau Dr.': ('11_geehrt_frau_dr', 'female')
						}

	for key in entry.keys ():
		if attributes.count (key):
			if key == 'birthday':
				if entry [key] != '':
					entry [key] = xmlrpclib.DateTime (strptime.strptime (entry [key], '%d.%m.%Y'))
				else:
					del entry [key]
			elif key == 'id':
				entry [key] = id_pref + entry [key]
			elif key == 'phones':
				for subkey in entry [key].keys ():
					if phoneTypes.count (subkey):
						entry [key][subkey]['type'] = subkey
			elif key == 'addresses':
				for subkey in entry [key].keys ():
					if addressTypes.count (subkey):
						entry [key][subkey]['type'] = subkey
			elif key == 'owner':
				entry [key]['id'] = id_pref + entry [key]['id']
			elif key == 'salutation':
				if salutation.has_key (entry [key]):
					values = salutation [entry [key]]
					entry ['salutation'] = values [0]
					entry ['gender'] = values [1]
			elif key == 'extendedAttrs':
				if entry [key].has_key ('lastChanged'):
					del entry [key]['lastChanged']

def getFields (line):
	if line [0] == ';':
		line = '""' + line
	if line [-1] == ';':
		line = line + '""'
	fields = line.split ('";"')
	fields [0] = fields [0][1:]
	fields [-1] = fields [-1][:-1]
	return fields

def insertEntries (dict, field, field_part, entry, attr):
	split_field = field_part.split ('.', 1)
	if len (split_field) != 1:
		if not (dict.has_key (split_field [0])):
			dict [split_field [0]] = {}
		new_part = ''
		for part in split_field [1:]:
			new_part = new_part + part
		insertEntries (dict [split_field [0]], field, new_part, entry, attr)
	else:
		dict [field_part] = entry [string.atoi (parser.get (attr, field)) - 1]

if __name__ == '__main__':
	print "|-> __main__"

	parser = CP ()
	parser.read ('import.cfg')

	url = parser.get ('options', 'server')
	user = parser.get ('options', 'user')
	password = parser.get ('options', 'password')

	server = xmlrpclib.ServerProxy (url, login=user, password=password)
	dummy = server.person.getById ("10000")
	id_pref = dummy ['id'][:-5]

	persons ()
