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

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

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

my $dir = "$DIRECTORY/$::SERVICE_NAME";
mkdir $dir or die "Can't create dir $dir: $!";

#Constants
our $A_UF_LOGIN;              *A_UF_LOGIN =                \'urn:perun:user_facility:attribute-def:virt:login';
our $A_R_APACHE_AUTHZ_FILE;   *A_R_APACHE_AUTHZ_FILE =     \'urn:perun:resource:attribute-def:def:apacheAuthzFile';

my $i = 0;
my %allApacheAuthzFilesNames;

foreach my $resourceId ($data->getResourceIds()) {
	# Check if there are not two same apacheAuthzFiles
	my $apacheAuthzFile = $data->getResourceAttributeValue(attrName => $A_R_APACHE_AUTHZ_FILE, resource => $resourceId);
	if(defined $allApacheAuthzFilesNames{$apacheAuthzFile}) {
		die "Duplicate apacheAuthzFileName detected: $apacheAuthzFile";
	} else {
		$allApacheAuthzFilesNames{$apacheAuthzFile} = $resourceId;
	}
}

foreach my $apacheAuthzFile (sort keys %allApacheAuthzFilesNames) {
	my $resourceId = $allApacheAuthzFilesNames{$apacheAuthzFile};

	$i++;
	my $authzFileDir = "$dir/$i";

	mkdir $authzFileDir or die "Can't create dir $authzFileDir: $!";

	my $pathFile = "$authzFileDir/path";

	open FILE,">$pathFile" or die "Cannot open $pathFile: $!";
	print FILE $apacheAuthzFile, "\n";
	close FILE or die "Cannot close $pathFile: $!";

	my $authzFile = "$authzFileDir/authz";
	open FILE,">$authzFile" or die "Cannot open $authzFile: $!";

	my @allowedLogins = ();
	foreach my $memberId ($data->getMemberIdsForResource(resource => $resourceId)) {
		push @allowedLogins, $data->getUserFacilityAttributeValue(attrName => $A_UF_LOGIN, member => $memberId);
	}

	print FILE "require user ";
	@allowedLogins = sort @allowedLogins;
	print FILE join " ", @allowedLogins;
	print FILE "\n";

	close(FILE) or die "Cannot close $authzFile: $!";
}

perunServicesInit::finalize;
