import frappe
from frappe.model import default_fields

def execute():
	frappe.reload_doc("email", "doctype", "email_account")

	# outgoing
	outgoing = dict(frappe.db.sql("select field, value from tabSingles where doctype='Outgoing Email Settings'"))
	if outgoing and outgoing['mail_server'] and outgoing['mail_login']:
		account = frappe.new_doc("Email Account")
		mapping = {
			"email_id": "mail_login",
			"password": "mail_password",
			"footer": "footer",
			"smtp_server": "mail_server",
			"smtp_port": "mail_port",
			"use_tls": "use_ssl"
		}

		for target_fieldname, source_fieldname in mapping.iteritems():
			account.set(target_fieldname, outgoing.get(source_fieldname))

		account.enable_outgoing = 1
		account.enable_incoming = 0

		account.insert()

	# support
	support = dict(frappe.db.sql("select field, value from tabSingles where doctype='Support Email Settings'"))
	if support and support['mail_server'] and support['mail_login']:
		account = frappe.new_doc("Email Account")
		mapping = {
			"enable_incoming": "sync_support_mails",
			"email_id": "mail_login",
			"password": "mail_password",
			"pop3_server": "mail_server",
			"use_ssl": "use_ssl",
			"signature": "support_signature",
			"enable_auto_reply": "send_autoreply",
			"auto_reply_message": "support_autoreply"
		}

		for target_fieldname, source_fieldname in mapping.iteritems():
			account.set(target_fieldname, support.get(source_fieldname))

		account.enable_outgoing = 0
		account.append_to = "Issue"

		insert_or_update(account)

	# sales, jobs
	for doctype in ("Sales Email Settings", "Jobs Email Settings"):
		source = dict(frappe.db.sql("select field, value from tabSingles where doctype=%s", doctype))
		if source and  source.get('host') and source.get('username'):
			account = frappe.new_doc("Email Account")
			mapping = {
				"enable_incoming": "extract_emails",
				"email_id": "username",
				"password": "password",
				"pop3_server": "host",
				"use_ssl": "use_ssl",
			}

			for target_fieldname, source_fieldname in mapping.iteritems():
				account.set(target_fieldname, source.get(source_fieldname))

			account.enable_outgoing = 0
			account.append_to = "Lead" if doctype=="Sales Email Settings" else "Job Applicant"

			insert_or_update(account)

	for doctype in ("Outgoing Email Settings", "Support Email Settings",
		"Sales Email Settings", "Jobs Email Settings"):
		frappe.delete_doc("DocType", doctype)

def insert_or_update(account):
	try:
		account.insert()
	except frappe.NameError, e:
		if e.args[0]=="Email Account":
			existing_account = frappe.get_doc("Email Account", e.args[1])
			for key, value in account.as_dict().items():
				if not existing_account.get(key) and value \
					and key not in default_fields \
					and key != "__islocal":
					existing_account.set(key, value)

			existing_account.save()
		else:
			raise

