#!/usr/bin/perl

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

our $SERVICE_NAME = "zabbix_mu";
our $PROTOCOL_VERSION = "3.0.0";
my $SCRIPT_VERSION = "3.0.0";

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

# CONSTANTS

our $A_USER_FIRSTNAME;           *A_USER_FIRSTNAME =           \'urn:perun:user:attribute-def:core:firstName';
our $A_USER_LASTNAME;            *A_USER_LASTNAME =            \'urn:perun:user:attribute-def:core:lastName';
our $A_USER_UCO;                 *A_USER_UCO =                 \'urn:perun:user:attribute-def:def:login-namespace:mu';
our $A_MR_ZABBIX_ROLE;    		 *A_MR_ZABBIX_ROLE =      	   \'urn:perun:resource:attribute-def:def:zabbixRole';
our $A_GR_ZABBIX_GR_NAME; 		 *A_GR_ZABBIX_GR_NAME =   	   \'urn:perun:resource:attribute-def:def:zabbixGroupName';
our $A_USER_PREF_MAIL;           *A_USER_PREF_MAIL =           \'urn:perun:user:attribute-def:def:preferredMail';

my $userData = {};
my $groupData = {};
# hold hashed group/role to prevent duplicates
my $groupUserData = {};
my $roleUserData = {};

foreach my $resourceId ($data->getResourceIds()) {
	my $groupName = $data->getResourceAttributeValue(resource => $resourceId, attrName => $A_GR_ZABBIX_GR_NAME);
	if (defined $groupName) {
		$groupData->{$groupName} = 1;
	}
	my $role = $data->getResourceAttributeValue( resource => $resourceId, attrName => $A_MR_ZABBIX_ROLE);

	for my $memberId ($data->getMemberIdsForResource(resource => $resourceId)) {
		my $uco = $data->getUserAttributeValue( member => $memberId, attrName => $A_USER_UCO );
		unless ($userData->{$uco} || (!defined $groupName && !defined $role)) {
			my $firstName = $data->getUserAttributeValue( member => $memberId, attrName => $A_USER_FIRSTNAME );
			my $lastName = $data->getUserAttributeValue( member => $memberId, attrName => $A_USER_LASTNAME );
			my $prefMail = $data->getUserAttributeValue( member => $memberId, attrName => $A_USER_PREF_MAIL );
			my $user = {
				identifier => $uco,
				firstName  => $firstName,
				lastName   => $lastName,
				email	   => $prefMail,
				groups     => [],
				roles     => []
			};
			$userData->{$uco} = $user;
		}
		if (defined $groupName) {
			$groupUserData->{$uco}->{$groupName} = 1;
			my @groups = keys(% {$groupUserData->{$uco}});
			$userData->{$uco}->{'groups'} = \@groups;

		}
		if (defined $role) {
			$roleUserData->{$uco}->{$role} = 1;
			my @roles = keys(% {$roleUserData->{$uco}});
			$userData->{$uco}->{'roles'} = \@roles;
		}
	}
}


my @userValues = values(%$userData);
my @groupValues = keys(%$groupData);
my $fileData = {
	groups  => \@groupValues,
	users    => \@userValues
};
my $file = "$DIRECTORY/$::SERVICE_NAME.json";
open FILE_USERS, ">$file" or die "Cannot open $file: $! \n";
print FILE_USERS JSON::XS->new->utf8->pretty->canonical->encode($fileData), "\n";
close(FILE_USERS) or die "Cannot close $file: $! \n";

perunServicesInit::finalize;
