#!/usr/share/ucs-test/runner python
## -*- coding: utf-8 -*-
## desc: create and modify user in azure
## tags: [apptest]
## exposure: dangerous
## packages:
##   - univention-office365

import time

import univention.testing.ucr as ucr_test
import univention.testing.utils as utils

from helpers.office365_test_helpers import AzureDirectoryTestUsers, azure_user_args, print_users
from univention.office365.azure_handler import AzureHandler, ApiError


with ucr_test.UCSTestConfigRegistry() as ucr:
	ah = AzureHandler(ucr, "ucs-test")

args = azure_user_args(ah, minimal=False)

print("*** Create_user(), args={}".format(args))
new_user1 = ah.create_user(args)
time.sleep(2)
oid = new_user1["objectId"]

with AzureDirectoryTestUsers(a_handler=ah, user_ids=[new_user1["objectId"]]):
	new_user2 = ah.list_users(objectid=oid)
	print("*** Azure test user:")
	print_users(new_user2, short=True, complete=False)

	modifications = azure_user_args(ah, minimal=False)
	failed = False

	for k, v in modifications.items():
		print("*** Changing property '{}'...".format(k))
		if k in ["mobile", "passwordProfile", "immutableId"]:
			print("  OK: cannot modify '{}', skipping it.".format(k))
			continue
		try:
			ah.modify_user(oid, {k: v})
			time.sleep(2)
		except ApiError as exc:
			print("  ApiError changing value of property '{}'  to '{}': {}".format(k, v, exc))
			if k == "usageLocation":
				print("  Country '{}' not allowed it seems, ignoring...".format(v))
			else:
				failed = True
			continue

		modified_user = ah.list_users(objectid=oid)
		if isinstance(modified_user[k], list):
			res = all([vv in modified_user[k] for vv in v])
		else:
			res = modified_user[k] == v
		if res:
			print("  OK.")
		else:
			print("  Fail: Value of property '{}' should be '{}', is '{}.".format(k, v, modified_user[k]))
			failed = True

	if failed:
		utils.fail("At least one modification failed.")

	modifications2 = azure_user_args(ah, minimal=False)
	for i in ["mobile", "passwordProfile", "usageLocation", "immutableId"]:
		del modifications2[i]
	print("*** Changing (almost) all properties at once: '{}'...".format(modifications2))
	ah.modify_user(oid, modifications2)
	time.sleep(5)
	modified_user2 = ah.list_users(objectid=oid)
	for k, v in modifications2.items():
		if isinstance(modified_user2[k], list):
			res = all([vv in modified_user2[k] for vv in v])
		else:
			res = modified_user2[k] == v
		if not res:
			print_users(modified_user2, short=False, complete=True)
			utils.fail("At least one modification failed.")

	print("*** All went well.")
