#!/usr/bin/perl

use strict;
use warnings;
use perunServicesInit;
use perunServicesUtils;
use JSON::XS;
use utf8;

local $::SERVICE_NAME = "arcgis_mu";
local $::PROTOCOL_VERSION = "3.0.0";
my $SCRIPT_VERSION = "3.0.1";

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

#Constants
our $A_USER_FIRST_NAME;           *A_USER_FIRST_NAME =      \'urn:perun:user:attribute-def:core:firstName';
our $A_USER_LAST_NAME;            *A_USER_LAST_NAME =       \'urn:perun:user:attribute-def:core:lastName';
our $A_USER_FACILITY_LOGIN;       *A_USER_FACILITY_LOGIN =  \'urn:perun:user_facility:attribute-def:virt:login';
our $A_RESOURCE_ARCGIS_ROLE;      *A_RESOURCE_ARCGIS_ROLE = \'urn:perun:resource:attribute-def:def:arcGISRole';

#Headers
my $firstNameHeader = "firstName";
my $lastNameHeader = "lastName";
my $loginHeader = "UCO";
my $rolesHeader = "roles";

#Structure
my $usersWithRoles = {};

#Prepare data to structure
foreach my $resourceId ($data->getResourceIds()) {
	my $roleOnResource = $data->getResourceAttributeValue(attrName => $A_RESOURCE_ARCGIS_ROLE, resource => $resourceId);

	#skip resources without rules
	next unless(defined $roleOnResource);

	foreach my $memberId ($data->getMemberIdsForResource(resource => $resourceId)) {
		my $firstName = $data->getUserAttributeValue(attrName => $A_USER_FIRST_NAME, member => $memberId);
		my $lastName = $data->getUserAttributeValue(attrName => $A_USER_LAST_NAME, member => $memberId);
		my $uco = $data->getUserFacilityAttributeValue(attrName => $A_USER_FACILITY_LOGIN, member => $memberId);

		if($usersWithRoles->{$uco}) {
			#user is already there, update his roles
			$usersWithRoles->{$uco}->{$rolesHeader}->{$roleOnResource} = 1;
		} else {
			#new user, create his record
			$usersWithRoles->{$uco}->{$firstNameHeader} = $firstName;
			$usersWithRoles->{$uco}->{$lastNameHeader} = $lastName;
			$usersWithRoles->{$uco}->{$loginHeader} = $uco;
			$usersWithRoles->{$uco}->{$rolesHeader}->{$roleOnResource} = 1;
		}

	}
}

#prepare correct json structure
my @data;
for my $key (keys %{$usersWithRoles}) {
	my $userRecord = {};
	$userRecord->{$firstNameHeader} = $usersWithRoles->{$key}->{$firstNameHeader};
	$userRecord->{$lastNameHeader} = $usersWithRoles->{$key}->{$lastNameHeader};
	$userRecord->{$loginHeader} = $usersWithRoles->{$key}->{$loginHeader};
	my @roles = keys %{$usersWithRoles->{$key}->{$rolesHeader}};
	$userRecord->{$rolesHeader} = \@roles;
	push @data, $userRecord;
}

#print json to the file
my $file = "$DIRECTORY/$::SERVICE_NAME.json";
open FILE,">$file" or die "Cannot open $file: $! \n";
binmode(FILE);
print FILE JSON::XS->new->utf8->pretty->canonical->encode(\@data);
close (FILE) or die "Cannot close $file: $! \n";

perunServicesInit::finalize;
