#!/usr/bin/perl
use feature "switch";
use strict;
use warnings;
use utf8;
use perunServicesInit;
use perunServicesUtils;

local $::SERVICE_NAME = "crm_ceitec";
local $::PROTOCOL_VERSION = "3.1.0";
my $SCRIPT_VERSION = "3.0.7";

perunServicesInit::init;
my $DIRECTORY = perunServicesInit::getDirectory;
my $fileName = "$DIRECTORY/$::SERVICE_NAME";

my $data = perunServicesInit::getHashedDataWithGroups;

# User attributes
our $A_FIRST_NAME;  *A_FIRST_NAME = \'urn:perun:user:attribute-def:core:firstName';
our $A_LAST_NAME;  *A_LAST_NAME = \'urn:perun:user:attribute-def:core:lastName';
our $A_MAIL;  *A_MAIL = \'urn:perun:user:attribute-def:def:preferredMail';
our $A_EPPNS; *A_EPPNS = \'urn:perun:user:attribute-def:virt:eduPersonPrincipalNames';
our $A_O; *A_O = \'urn:perun:member:attribute-def:def:organization';
our $A_LOGIN; *A_LOGIN = \'urn:perun:user:attribute-def:def:login-namespace:ceitec';
our $A_U_ALT_LOGINS; *A_U_ALT_LOGINS = \'urn:perun:user:attribute-def:virt:alternativeLoginNames';
our $A_G_NAME; *A_G_NAME = \'urn:perun:group:attribute-def:core:name';

# GATHER USERS
my $users;  # $users->{$login}->{ATTR} = $attrValue;
# Unique users groups
my $userGroups; # $userGroups->{$login}->{$groupName} = 1;

#
# AGGREGATE DATA
#
# FOR EACH RESOURCE
foreach my $resourceId ( $data->getResourceIds() ) {
	foreach my $groupId ( $data->getGroupIdsForResource( resource => $resourceId ) ) {
		for my $memberId ( $data->getMemberIdsForResourceAndGroup( resource => $resourceId, group => $groupId )) {
			my $login = $data->getUserAttributeValue( member => $memberId, attrName => $A_LOGIN );
			my $groupName = $data->getGroupAttributeValue( group => $groupId, attrName => $A_G_NAME );

			# store standard attrs
			$users->{$login}->{$A_FIRST_NAME} = $data->getUserAttributeValue( member => $memberId, attrName => $A_FIRST_NAME );
			$users->{$login}->{$A_LAST_NAME} = $data->getUserAttributeValue( member => $memberId, attrName => $A_LAST_NAME );
			$users->{$login}->{$A_MAIL} = $data->getUserAttributeValue( member => $memberId, attrName => $A_MAIL );
			$users->{$login}->{$A_O} = $data->getMemberAttributeValue( member => $memberId, attrName => $A_O );
			$users->{$login}->{$A_EPPNS} = $data->getUserAttributeValue( member => $memberId, attrName => $A_EPPNS );
			$users->{$login}->{$A_U_ALT_LOGINS} = $data->getUserAttributeValue( member => $memberId, attrName => $A_U_ALT_LOGINS );
			$userGroups->{$login}->{$groupName} = 1;

		}

	}
}

# print result
#
# PRINT user data LDIF
#
open FILE,">:encoding(UTF-8)","$fileName" or die "Cannot open $fileName: $! \n";

# FOR EACH USER ON FACILITY
my @logins = sort keys %{$users};
for my $login (@logins) {

	my $lastName = $users->{$login}->{$A_LAST_NAME} || "";
	my $firstName = $users->{$login}->{$A_FIRST_NAME} || "";
	my $mail = $users->{$login}->{$A_MAIL};
	my $o = $users->{$login}->{$A_O};
	my $eppns = $users->{$login}->{$A_EPPNS};
	my $groups = join('#' , sort keys %{$userGroups->{$login}});
	my $list = $users->{$login}->{$A_U_ALT_LOGINS};
	my $altLogins = join(',', sort @{$list});

	if (defined $o and length $o) {

		# unify VUT name to Czech version
		if (("Brno University of Technology" eq $o)) {
			$o = "Vysoké učení technické v Brně";
		}

		print FILE 'CEITEC\\' . "$login;" . "$firstName;" . "$lastName;" . "$mail;" . "$o;";

		if (defined $eppns) {
			foreach my $val (sort @$eppns) {
				if (("Masarykova univerzita" eq $o) && ($val =~ /\@muni.cz$/)) {
					print FILE "$val";
					last;
				} elsif (("Vysoké učení technické v Brně" eq $o) && ($val =~ /\@vutbr.cz$/)) {
					my $index = index($val, '@');
					print FILE substr($val, 0, $index);
					last;
				}
			}
			my $eppn_string = "";
			foreach my $eppn_val (sort @$eppns) {
				# construct eppn string
				$eppn_string = $eppn_string . $eppn_val . ",";
			}
			$eppn_string = substr($eppn_string, 0, -1);
			print FILE ";" . $eppn_string;
		} else {
			# make orgId and eppns empty
			print FILE ";"
		}

	} else {
		# No organization provided, no orgId and eppns will be set either
		print FILE 'CEITEC\\' . "$login;" . "$firstName;" . "$lastName;" . "$mail;" . ";;";
	}

	print FILE ";" . $groups . ";". $altLogins . "\n";

}

close(FILE);

perunServicesInit::finalize;
