#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long qw(:config no_ignore_case);
use Text::ASCIITable;
use Perun::Agent;
use Perun::Common qw(printMessage getSortingFunction tableContentToPrint);

sub help {
	return qq{
	Lists hostnames and their number of cores.
	---------------------------------------------------
	Available options:
	--facilityName | -F  facility name
	--facilityId   | -f  facility Id
	--orderById    | -i  order by ID
	--orderByName  | -n  order by name
	--batch        | -b  batch
	--help         | -h  prints this help

	If no facility is entered, list for all facilities is displayed.
	};
}

my ($facilityName, $facilityId, $all, $sortingFunction, $batch, @facilities, @hosts);
GetOptions("help|h"    => sub {
		print help;
		exit 0;
	},
	"facilityId|f=i"   => \$facilityId,
	"facilityName|F=s" => \$facilityName,
	"orderByName|n"    => sub {$sortingFunction = getSortingFunction("getHostname", 1)},
	"orderById|i"      => sub { $sortingFunction = getSortingFunction("getId")},
	"batch|b"          => \$batch) || die help;

#options check
unless (defined $facilityId or (defined $facilityName)) { $all = 1;} else {$all = 0;}
unless (defined $sortingFunction) { $sortingFunction = getSortingFunction("getHostname", 1); }

my $sortingFunction2 = getSortingFunction("getName", 1);
my $attrName = "urn:perun:host:attribute-def:def:coresNumber";

my $agent = Perun::Agent->new();

my $attributesAgent = $agent->getAttributesAgent;
my $facilitiesAgent = $agent->getFacilitiesAgent;

if ($all > 0) {
	@facilities = $facilitiesAgent->getFacilities;
	unless (@facilities) {
		printMessage "No Facilities found", $batch;
		exit 0;
	}
} else {
	my $facility;
	if ($facilityId) {
		$facility = $facilitiesAgent->getFacilityById( id => $facilityId );
	}
	if ($facilityName) {
		$facility = $facilitiesAgent->getFacilityByName( name => $facilityName );
	}
	$facilities[0] = $facility;
}

my @rows = ();
foreach my $facility (sort $sortingFunction2 @facilities) {
	my $facilityId = $facility->getId;
	my $facilityName = $facility->getName;

	@hosts = $facilitiesAgent->getHosts( facility => $facilityId );
	unless (@hosts) {
		printMessage "No Host found for facility $facilityName", $batch;
		next;
	}
	foreach my $host (sort $sortingFunction @hosts) {
		my $hostId = $host->getId;
		my $hostName = $host->getHostname;
		my $attribute = $attributesAgent->getAttribute( attributeName => $attrName, host => $hostId );
		my $numCores;
		$numCores = $attribute->getValueAsScalar;
		unless (defined $numCores) { $numCores = "undefined";}

		my @row = ($facilityName, $hostName, $numCores);
		push(@rows, \@row);
	}
}

my @columnsNames = ('Facility name', 'Host name', 'Number of cores');
print tableContentToPrint(\@columnsNames, \@rows, $batch);
