#!/usr/bin/perl
use strict;
use warnings;
use perunServicesInit;
use perunServicesUtils;
use File::Basename;
use JSON::XS;

our $SERVICE_NAME = basename($0);
our $PROTOCOL_VERSION = "3.1.1";
my $SCRIPT_VERSION = "3.0.3";

perunServicesInit::init;
my $DIRECTORY = perunServicesInit::getDirectory;
my $data = perunServicesInit::getHashedHierarchicalData;

#Constants
our $A_USER_ID;                 *A_USER_ID =                   \'urn:perun:user:attribute-def:core:id';
our $A_USER_IDENTIFIER;         *A_USER_IDENTIFIER =           \'urn:perun:user:attribute-def:def:login-namespace:bbmri-persistent-shadow';
our $A_USER_LOGIN_BBMRI;        *A_USER_LOGIN_BBMRI =          \'urn:perun:user:attribute-def:def:login-namespace:bbmri';
our $A_USER_PREFERRED_MAIL;     *A_USER_PREFERRED_MAIL =       \'urn:perun:user:attribute-def:def:preferredMail';
our $A_USER_RT_PREF_MAIL;       *A_USER_RT_PREF_MAIL =         \'urn:perun:user:attribute-def:def:rtPreferredMail';
our $A_USER_LAST_NAME;          *A_USER_LAST_NAME =            \'urn:perun:user:attribute-def:core:lastName';
our $A_USER_MIDDLE_NAME;        *A_USER_MIDDLE_NAME =          \'urn:perun:user:attribute-def:core:middleName';
our $A_USER_FIRST_NAME;         *A_USER_FIRST_NAME =           \'urn:perun:user:attribute-def:core:firstName';
our $A_USER_DISPLAY_NAME;       *A_USER_DISPLAY_NAME =         \'urn:perun:user:attribute-def:core:displayName';
our $A_USER_ORGANIZATION;       *A_USER_ORGANIZATION =         \'urn:perun:user:attribute-def:def:organization';
our $A_RES_NAME;                *A_RES_NAME =                  \'urn:perun:resource:attribute-def:core:name';
our $A_RES_RT_GROUP_NAME;       *A_RES_RT_GROUP_NAME =         \'urn:perun:resource:attribute-def:def:rtGroupName';
our $A_FAC_OUTPUT_FILE_NAME;    *A_FAC_OUTPUT_FILE_NAME =      \'urn:perun:facility:attribute-def:def:rtOutputFileName';

#Headers
our $LOGIN_HEADER = 'login';
our $IDENTIFIER_HEADER = 'identifier';
our $PREF_MAIL_HEADER = 'preferredMail';
our $LAST_NAME_HEADER = 'lastName';
our $MIDDLE_NAME_HEADER = 'middleName';
our $FIRST_NAME_HEADER = 'firstName';
our $DISPLAY_NAME_HEADER = 'displayName';
our $ORGANIZATION_HEADER = 'organization';
our $GROUPS_IN_RT_HEADER = 'groupsInRT';

my $service_file_name = "$DIRECTORY/$::SERVICE_NAME";
my $file_with_output_file_name = "$DIRECTORY/output_file_name";

my $usersStructureByUserId = {};

#####################################

my $output_file_name = $data->getFacilityAttributeValue(attrName => $A_FAC_OUTPUT_FILE_NAME) || 'rt-bbmri-data';

foreach my $resourceId ($data->getResourceIds()) {

	my $rtGroupName = $data->getResourceAttributeValue(attrName => $A_RES_RT_GROUP_NAME, resource => $resourceId)
		|| $data->getResourceAttributeValue(attrName => $A_RES_NAME, resource => $resourceId);

	foreach my $memberId ($data->getMemberIdsForResource(resource => $resourceId)) {

		my $userId = $data->getUserAttributeValue(attrName => $A_USER_ID, member => $memberId);
		unless(defined $usersStructureByUserId->{$userId}) {
			my $login = $data->getUserAttributeValue(attrName => $A_USER_LOGIN_BBMRI, member => $memberId);
			my $identifier = $data->getUserAttributeValue(attrName => $A_USER_IDENTIFIER, member => $memberId);
			my $userPrefMail = $data->getUserAttributeValue(attrName => $A_USER_RT_PREF_MAIL, member => $memberId)
				|| $data->getUserAttributeValue(attrName => $A_USER_PREFERRED_MAIL, member => $memberId);;
			my $lastName = $data->getUserAttributeValue(attrName => $A_USER_LAST_NAME, member => $memberId);
			my $middleName = $data->getUserAttributeValue(attrName => $A_USER_MIDDLE_NAME, member => $memberId);
			my $firstName = $data->getUserAttributeValue(attrName => $A_USER_FIRST_NAME, member => $memberId);
			my $displayName = $data->getUserAttributeValue(attrName => $A_USER_DISPLAY_NAME, member => $memberId);
			my $organization = $data->getUserAttributeValue(attrName => $A_USER_ORGANIZATION, member => $memberId);

			$usersStructureByUserId->{$userId}->{$PREF_MAIL_HEADER} = $userPrefMail;
			$usersStructureByUserId->{$userId}->{$LAST_NAME_HEADER} = $lastName;
			$usersStructureByUserId->{$userId}->{$MIDDLE_NAME_HEADER} = $middleName;
			$usersStructureByUserId->{$userId}->{$FIRST_NAME_HEADER} = $firstName;
			$usersStructureByUserId->{$userId}->{$DISPLAY_NAME_HEADER} = $displayName;
			$usersStructureByUserId->{$userId}->{$LOGIN_HEADER} = $login;
			$usersStructureByUserId->{$userId}->{$IDENTIFIER_HEADER} = $identifier;
			$usersStructureByUserId->{$userId}->{$ORGANIZATION_HEADER} = $organization;
			$usersStructureByUserId->{$userId}->{$GROUPS_IN_RT_HEADER} = ();
		}

		my @listOfRTGroups = sort uniqList((@{$usersStructureByUserId->{$userId}->{$GROUPS_IN_RT_HEADER}},  $rtGroupName));
		$usersStructureByUserId->{$userId}->{$GROUPS_IN_RT_HEADER} = \@listOfRTGroups;
	}
}

####### FILE WITH NAME OF THE OUTPUT FILE ######
open NAME_FILE,">$file_with_output_file_name" or die "Cannot open $file_with_output_file_name: $! \n";
binmode NAME_FILE, ":utf8";
print NAME_FILE $output_file_name;
close(NAME_FILE);

my @users = sort { $a->{$LOGIN_HEADER} cmp $b->{$LOGIN_HEADER} } values %$usersStructureByUserId;
####### FILE WITH JSON DATA FOR OUTPUT FILE ######
open SERVICE_FILE,">$service_file_name" or die "Cannot open $service_file_name: $! \n";
print SERVICE_FILE JSON::XS->new->utf8->pretty->canonical->encode(\@users);
close(SERVICE_FILE) or die "Cannot close $service_file_name: $! \n";

perunServicesInit::finalize;
