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

our $SERVICE_NAME = basename($0);
our $PROTOCOL_VERSION = "3.0.0";
our $SCRIPT_VERSION = "3.0.0";

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_CERT_DN;                    *A_USER_CERT_DN =                 \'urn:perun:user:attribute-def:def:userPreferredCertDN';
our $A_USER_MAIL;                       *A_USER_MAIL =                    \'urn:perun:user:attribute-def:def:preferredMail';
our $A_R_VO_SHORT_NAME;                 *A_R_VO_SHORT_NAME =              \'urn:perun:resource:attribute-def:virt:voShortName';
our $A_USER_STATUS;                     *A_USER_STATUS =                  \'urn:perun:member:attribute-def:core:status';

our $STATUS_VALID;                      *STATUS_VALID =                     \'VALID';

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

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

####### output file ######################
open SERVICE_FILE,">$service_file_name" or die "Cannot open $service_file_name: $! \n";
binmode SERVICE_FILE,":utf8";

# CVS header
print SERVICE_FILE "# firstName, lastName, certDN, voName, mail\n";

# Sort by name
my $sortingFunction = getAttributeSorting $A_USER_LAST_NAME, 1;

my @membersAttributes;
foreach my $resourceId ( $data->getResourceIds() ) {
	foreach my $memberId ($data->getMemberIdsForResource( resource => $resourceId )) {
		my %mAttrs = ();
		$mAttrs{$A_R_VO_SHORT_NAME} = $data->getResourceAttributeValue(resource => $resourceId, attrName => $A_R_VO_SHORT_NAME);
		$mAttrs{$A_USER_STATUS} = $data->getMemberAttributeValue(member => $memberId, attrName => $A_USER_STATUS );
		$mAttrs{$A_USER_FIRST_NAME} = $data->getUserAttributeValue(member => $memberId, attrName => $A_USER_FIRST_NAME );
		$mAttrs{$A_USER_LAST_NAME} = $data->getUserAttributeValue(member => $memberId, attrName => $A_USER_LAST_NAME );
		$mAttrs{$A_USER_CERT_DN} = $data->getUserAttributeValue(member => $memberId, attrName => $A_USER_CERT_DN );
		$mAttrs{$A_USER_MAIL} = $data->getUserAttributeValue(member => $memberId, attrName => $A_USER_MAIL );
		push @membersAttributes, \%mAttrs;
	}
}

foreach my $memberAttributes (sort $sortingFunction @membersAttributes) {
	if ($memberAttributes->{$A_USER_STATUS} eq $STATUS_VALID) {
		# Print attributes
		if (defined $memberAttributes->{$A_USER_FIRST_NAME}) { print SERVICE_FILE $memberAttributes->{$A_USER_FIRST_NAME} . ','; }
		else { print SERVICE_FILE ','; };
		if (defined $memberAttributes->{$A_USER_LAST_NAME}) { print SERVICE_FILE $memberAttributes->{$A_USER_LAST_NAME} . ','; }
		else { print SERVICE_FILE ','; };
		if (defined $memberAttributes->{$A_USER_CERT_DN}) { print SERVICE_FILE $memberAttributes->{$A_USER_CERT_DN} . ','; }
		else { print SERVICE_FILE ','; };
		print SERVICE_FILE $memberAttributes->{$A_R_VO_SHORT_NAME} . ',';
		if (defined $memberAttributes->{$A_USER_MAIL}) { print SERVICE_FILE $memberAttributes->{$A_USER_MAIL} . "\n"; }
		else { print SERVICE_FILE "\n"; };
	}
}
close(SERVICE_FILE);
#####################################################
perunServicesInit::finalize;
