#!/usr/bin/perl -s

use common::sense;

our ($v); #verbose

my @folders = grep { -d } <*>;

if (@ARGV) {
	my %h;
	@h{@ARGV} = @ARGV;
	@folders = grep { exists $h{$_} } @folders;
} else {
	my %h;
	open C, "<", "../classes.txt" or die "Can't open classes file: $!";
	while (<C>) {
		chomp;
		m/([a-z-]+)/;
		$h{$1}++;
	}
	close C;
	@folders = grep { exists $h{$_} } @folders;
}

my $tests = {};
my $fails = {};

my $nr_tests = 0;
for my $folder (@folders) {
	my @files = <$folder/*.txt>;
	$tests->{$folder} = [@files];

	$nr_tests ++;
}

my $big_total = 0;
my $big_ok = 0;
for my $lang (@folders) {
	my $nr_tests = scalar(@{$tests->{$lang}});
	my $failed = {};
	my $ok = 0;

	print "--- ", uc($lang), " ---\n";

	my $args = join(" ", map { "testSuite/$_" } @{$tests->{$lang}});
	my $out = `cd ..; $^X forwardProp.pl -gsl -v $args`;

	my @ids = split /\n\n/, $out;

	my $i = 0;
	for my $inferred (@ids) {
		my $file = @{$tests->{$lang}}[$i++];
		my %pts = map { (split /\t/, $_) } split /\n/, $inferred;
		my @predicted = sort { $pts{$b} <=> $pts{$a} } keys %pts;
		my $predicted = $predicted[0];

		if ($predicted ne $lang) {
			$failed->{$predicted}++;
			if ($v)	{
				my $second = $predicted[1];
				printf "      (failed %s: %s/%.2f%% %s/%.2f%%)\n",
					$file, $predicted, $pts{$predicted}*100, $second, $pts{$second}*100;
			}
		} else {
			$ok++;
		}
	}

	printf " %7.3f%% correctly identified (%d tests)\n", (100*$ok/$nr_tests), $nr_tests;
	for my $fail (keys %$failed) {
		printf " %7.3f%% misidentified as %s\n", (100*$failed->{$fail}/$nr_tests), uc $fail;
	}

	$big_ok += $ok;
	$big_total += $nr_tests;
}

print "--- Summary ---\n";
printf " %d languages\n", scalar(@folders);
printf " %7.3f%% correctly identified\n", (100*$big_ok/$big_total);