#!/usr/share/ucs-test/runner python
## desc: Add js widgets through ucr for UDM syntax
## tags: [udm,SKIP]
## roles: [domaincontroller_master]
## exposure: careful
## packages:
##   - univention-config
##   - univention-directory-manager-tools

from __future__ import print_function
import bz2
import base64

import univention.testing.udm as udm_test
import univention.testing.ucr as ucr_test
import univention.testing.utils as utils
import univention.testing.strings as uts
from univention.testing.umc import Client

from univention.config_registry import handler_set


SYNTAX = (
	'from univention.admin.syntax import string\n'
	'class {}(string):\n'
	'  pass\n'
)
SUB_SYNTAX = (
	'from univention.admin.syntax import {syntax}\n'
	'class {sub_syntax}({syntax}):\n'
	'  pass\n'
)


class TestUcrWidgets(object):

	def __enter__(self):
		self.udm = udm_test.UCSTestUDM().__enter__()
		self.ucr = ucr_test.UCSTestConfigRegistry().__enter__()
		return self

	def __exit__(self, *args):
		self.udm.__exit__(*args)
		self.ucr.__exit__(*args)

	def _create_extended_attribute(self, syntax, number, sub_syntax=None):
		self.udm.create_object(
			'settings/udm_syntax',
			position=self.udm.UNIVENTION_CONTAINER,
			name=syntax,
			filename='{}.py'.format(syntax),
			data=base64.b64encode(bz2.compress(SYNTAX.format(syntax))),
			package=syntax,
			packageversion='1'
		)
		self.udm.create_object(
			'settings/extended_attribute',
			position=self.udm.UNIVENTION_CONTAINER,
			name=uts.random_name(),
			shortDescription=uts.random_name(),
			CLIName='ucrTestAttr{}'.format(number),
			module='users/user',
			tabName='ucrWidgetTestTab',
			objectClass='univentionFreeAttributes',
			ldapMapping='univentionFreeAttribute{}'.format(number),
			syntax=sub_syntax if sub_syntax else syntax,
		)
		if sub_syntax:
			self.udm.create_object(
				'settings/udm_syntax',
				position=self.udm.UNIVENTION_CONTAINER,
				name=sub_syntax,
				filename='{}.py'.format(sub_syntax),
				data=base64.b64encode(bz2.compress(SUB_SYNTAX.format(syntax=syntax, sub_syntax=sub_syntax))),
				package=syntax,
				packageversion='1'
			)
		utils.wait_for_replication()

	def test_simple_widget(self):
		print('Test simple ucr widget')
		client = Client.get_test_connection()
		widget = 'ucrSimpleWidget'
		syntax = '{}Syntax'.format(widget)
		number = '1'
		self._create_extended_attribute(syntax, number)
		handler_set([
			'directory/manager/web/widget/{}/widget=umc/{}'.format(widget, widget),
			'directory/manager/web/widget/{}/syntax={}'.format(widget, syntax),
		])
		properties = client.umc_command(
			'udm/properties',
			options=[{'objectType': 'users/user'}],
			flavor='users/user'
		).result
		for udm_property in properties[0]:
			if 'type' in udm_property and udm_property['type'] == 'umc/{}'.format(widget):
				print('OK: UCR defined widget is set as type')
				break
		else:
			utils.fail('UCR defined widget is NOT set as type')

	def test_subclass_widget(self):
		print('Test ucr widget for subclass syntax')
		client = Client.get_test_connection()
		widget = 'ucrSubclassWidget'
		syntax = '{}Syntax'.format(widget)
		sub_syntax = 'under{}'.format(syntax)
		number = '2'
		self._create_extended_attribute(syntax, number, sub_syntax=sub_syntax)
		handler_set([
			'directory/manager/web/widget/{}/widget=umc/{}'.format(widget, widget),
			'directory/manager/web/widget/{}/syntax={}'.format(widget, syntax),
			'directory/manager/web/widget/{}/subclasses=yes'.format(widget),
		])
		properties = client.umc_command(
			'udm/properties',
			options=[{'objectType': 'users/user'}],
			flavor='users/user'
		).result
		for udm_property in properties[0]:
			if 'type' in udm_property and udm_property['type'] == 'umc/{}'.format(widget):
				print('OK: UCR defined widget is set as type for subclass syntax')
				break
		else:
			utils.fail('UCR defined widget is NOT set as type for subclass syntax')

	def test_default_widget(self):
		print('Test ucr widget default value')
		client = Client.get_test_connection()
		widget = 'ucrDefaultWidget'
		syntax = '{}Syntax'.format(widget)
		number = '3'
		self._create_extended_attribute(syntax, number)
		handler_set([
			'directory/manager/web/widget/{}/widget=umc/{}'.format(widget, widget),
			'directory/manager/web/widget/{}/syntax={}'.format(widget, syntax),
			'directory/manager/web/widget/{}/default=ucrDeafultValue'.format(widget),
		])
		value = client.umc_command(
			'udm/values',
			options={'objectType': 'users/user', 'objectProperty': 'ucrTestAttr{}'.format(number)},
			flavor='users/user'
		).result
		if value == 'ucrDeafultValue':
			print('OK: UCR defined widget has default value')
		else:
			utils.fail('UCR defined widget has NO default value')

	def test_property_widget(self):
		client = Client.get_test_connection()
		widget = 'ucrPropertyWidget'
		syntax = '{}Syntax'.format(widget)
		number = '4'
		self._create_extended_attribute(syntax, number)
		handler_set([
			'directory/manager/web/widget/{}/widget=umc/{}'.format(widget, widget),
			'directory/manager/web/widget/{}/syntax={}'.format(widget, syntax),
			'directory/manager/web/widget/{}/property/{}/{}=umcOverride/{}'.format(
				widget, syntax, 'ucrTestAttr{}'.format(number), widget
			),
		])
		properties = client.umc_command(
			'udm/properties',
			options=[{'objectType': 'users/user'}],
			flavor='users/user'
		).result
		for udm_property in properties[0]:
			if 'type' in udm_property and udm_property['type'] == 'umcOverride/{}'.format(widget):
				print('OK: UCR defined widget is set as type for property')
				break
		else:
			utils.fail('UCR defined widget is NOT set as type for property')


if __name__ == '__main__':
	with TestUcrWidgets() as testUcrWidgets:
		testUcrWidgets.test_simple_widget()
		testUcrWidgets.test_subclass_widget()
		testUcrWidgets.test_default_widget()
		testUcrWidgets.test_property_widget()
