#!/usr/bin/perl -I/usr/sausalito/perl

use strict;
use Data::Dumper;
use CCE;

my $cce = new CCE();

$cce->connectuds();

# get list of all the capgroups
my $capGroups = {};
{
	my @oids = $cce->find("CapabilityGroup");
	foreach my $oid (@oids) {
		my ($ok, $obj) = $cce->get($oid);
		$capGroups->{$obj->{name}} = $obj;
		# explode the children
		$capGroups->{$obj->{name}}->{children} = {map {$_ => 1} $cce->scalar_to_array($obj->{capabilities})};
	}
}

my $caps = {};
{
	my ($ok, @names) = $cce->names("Capabilities");
	my @oids = $cce->find("Capabilities");
	my $oid = $oids[0];
	foreach my $name (@names) {
		my ($ok, $obj) = $cce->get($oid,$name);
		$caps->{$name} = $obj;
	}
}

my $level = 0;

my $topLevelCapGroups = {};
# go through and find all the nodes in the graph that do not have children
foreach my $capGroup (keys %$capGroups) {
	my $children = $capGroups->{$capGroup}->{children};
	foreach my $child (keys %$children) {
		if ($capGroups->{$child}) {
			$capGroups->{$child}->{interLevel} = 1;
		}
	}
}

# loop through and print the graph
for my $capGroup (keys %$capGroups) {
	# skip if we are not at the top
	if ($capGroups->{$capGroup}->{interLevel}) {
		next;
	}
	showBranch($capGroup, $capGroups, $caps);
}

# determine what WASN'T seen
print << "EOF";

Capabilities that were never refered:
-------------------------------------
EOF
for my $cap (keys %$caps) {
	if (!$caps->{$cap}->{used}) {
		print "$cap\n";
	}
}

# if we want,   we go through and check that each of the i18n tags are valid
if ($ARGV[0] eq "-v") {
	use I18n;
	my $i18n = new I18n();
	$i18n->setLocale(I18n::i18n_getSystemLocale($cce));
	print << "EOF";

I18n Tags Missing:
-----------------
EOF
	for my $capGroup (keys %$capGroups) {
		my $nameTag = $capGroups->{$capGroup}->{nameTag};
		my $nameTagHelp = $capGroups->{$capGroup}->{nameTagHelp};
		my $i18nTag = $i18n->get($nameTag);
		my $i18nTagHelp = $i18n->get($nameTagHelp);
		$nameTag =~ m/\[\[(\S+\.)?(\S+)\]\]/;
		my $nameTagToken = $2;
		$nameTagHelp =~ m/\[\[(\S+\.)?(\S+)\]\]/;
		my $nameTagHelpToken = $2;
		if ($i18nTag eq $nameTagToken || $i18nTagHelp eq $nameTagHelpToken) {
			print "CapabilityGroup '$capGroup':\n";
			if ($i18nTag eq $nameTagToken) {
				print "\tnameTag: " . $nameTag . "\n"; 
			}
			if ($i18nTagHelp eq $nameTagHelpToken) {
				print "\tnameTagHelp: " . $nameTagHelp . "\n";
			}
		}
	}

	for my $cap (keys %$caps) {
		my $nameTag = $caps->{$cap}->{nameTag};
		my $i18nTag = $i18n->get($nameTag);
		$nameTag =~ m/\[\[(\S+\.)?(\S+)\]\]/;
		if ($2 eq $i18nTag) {
			print "Capability '$cap':\n";
			print "\tnameTag: " . $nameTag . "\n";
		}
	}
}


sub showBranch {
	my $capGroup = shift;
	my $capGroups = shift;
	my $caps = shift;
	my $level = shift || 0;
	for (my$i;$i<$level;$i++) {print "\t"};
	print $capGroup . 
		($capGroups->{$capGroup} ?
			" [CapabilityGroup] "
			: ( $caps->{$capGroup} ?
				" [Capability] "
				: " [UNKNOWN] " ))
		. "\n";
	$level++;

	if ($capGroups->{$capGroup}) {
		# we have children!
		$capGroups->{$capGroup}->{used} = 1;
		my $children = $capGroups->{$capGroup}->{children};
		foreach my $child (keys %$children) {
			showBranch($child, $capGroups, $caps, $level);
		}
	} elsif ($caps->{$capGroup}) {
		$caps->{$capGroup}->{used} = 1;
	}
}

