#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long qw(:config no_ignore_case);
use Perun::Agent;
use Perun::Common qw(printMessage);
use Switch;
use Data::Dumper;

sub help {
	return qq{
	Sets critical actions on attributes. Overwrites existing setting.
	ACTION = R (Read), W (Write), R+W (Read + Write), N (no critical actions)
	--------------------------------------
	Available options:
	--attributeId       | -a attribute identifier
	--attributeName     | -A attribute name (including namespace)
	--criticalActions   | -c critical actions
	--batch             | -b batch
    --help              | -h prints this help
	};
}

my ($attributeId, $attributeName, $criticalActions, $batch);

GetOptions("help|h"   => sub {
	print help;
	exit 0;
},
	"attributeId|a=i"       => \$attributeId,
	"attributeName|A=s"     => \$attributeName,
	"criticalActions|p=s"   => \$criticalActions,
	"batch|b"               => \$batch) || die help();

# Check options
unless (defined $attributeId or defined $attributeName) { die "ERROR: attributeId or attributeName is required\n";}
unless (defined($criticalActions)) { die "ERROR: criticalActions is required \n";}

my $agent = Perun::Agent->new();
my $attributesAgent = $agent->getAttributesAgent;
my $attributeDefinition;
if (defined $attributeName and not defined $attributeId) {
	$attributeDefinition = $attributesAgent->getAttributeDefinition( attributeName => $attributeName );
	$attributeId=$attributeDefinition->getId;
}

my @oldActions = ();
@oldActions = $attributesAgent->getAttributeRules( attributeDefinition => $attributeId )->getCriticalActions;

my @newActions = ();
switch($criticalActions) {
	case "R" {
		push(@newActions, "READ");
	}
	case "W" {
		push(@newActions, "WRITE");
	}
	case "R+W" {
		push(@newActions, "READ");
		push(@newActions, "WRITE");
	}
	case "N" {
		# keep list empty
	}
	else {
		die "ERROR: invalid action.\n";
	}
}

foreach my $action (@oldActions) {
	if (! grep(/^$action$/, @newActions)) {
		$attributesAgent->setAttributeActionCriticality( critical => \0, attributeDefinition => $attributeId, action => $action );
	}
}

foreach my $action (@newActions) {
	if (! grep(/^$action$/, @oldActions)) {
		$attributesAgent->setAttributeActionCriticality(critical => \1, attributeDefinition => $attributeId, action => $action );
	}
}

printMessage "Critical actions for attribute $attributeId successfully set", $batch;
