from collections import namedtuple

from parallels.core.utils.common.xml import elem, text_elem

from .. import core

MailUserInfo = namedtuple('MailUserInfo', ('name'))


class MailOperator(object):
	class Dataset(object):
		GEN_INFO = 'gen_info'
		values = [GEN_INFO]

	FilterBySiteId = core.declare_filter('FilterBySiteId', 'site-id')

	class SetPrefs(core.operation_with_filter('Get', ('nonexistent_user',))):
		operator_name = 'mail'
		operation_name = 'set_prefs'
		min_api_version = '1.6.3.0'
		max_api_version = None

		class NonexistentUserForward(namedtuple('NonexistentUserForward', ('forward'))):
			def inner_xml(self):
				return text_elem('forward', self.forward)

		class NonexistentUserReject(object):
			def inner_xml(self):
				return elem('reject')

		def data_xml(self):
			xml = []
			if self.nonexistent_user is not None:
				xml.append(
					elem('prefs', [
						elem('nonexistent-user', 
							[self.nonexistent_user.inner_xml()]
						)]
					)
				)
			return xml
					
		@classmethod
		def parse(cls, elem):
			return [core.Result.parse(r) for r in elem.findall('result')]

	class Get(core.operation_with_filter('Get', ('mailbox',))):
		operator_name = 'mail'
		operation_name = 'get_info'
		min_api_version = '1.6.3.0'
		max_api_version = None

		def data_xml(self):
			return [
				elem('mailbox', [])
			]

		@classmethod
		def parse(cls, elem):
			return core.parse_result_set(elem,  cls._parse_data, 'mailname')

		@classmethod
		def _parse_data(cls, elem):
			return MailUserInfo (
				name=elem.findtext('mailname/name')
			)