#! /usr/bin/perl
use 5.14.0;
use strict;
use warnings;
use Template;
use List::Util qw(max);

my %fail;

foreach my $file (glob "out*/log.*") {
    my ($name, $platform) = $file =~ /out-?(.*?)\/log\.(.*)/;
    my ($os) = $platform =~ /(^.*?)-/;
    $_ = do { local @ARGV = $file; local $/ = undef; <> };
    s/
/\n/g;
    my ($version) = /^Exim version (\S+)/mi;
    my ($ssl) =
        /^Support for: .*\bGnuTLS/mi    ? 'GnuTLS'
      : /^Support for: .*\bOpenSSL\b/mi ? 'OpenSSL'
      :                                   'No SSL';

    $fail{$os}{$ssl}{$version} = {};

    foreach (/^\*{2}.*\/(\d+)\s+failed.*?=+/mg) {
        $fail{$os}{$ssl}{$version}{_failed}{$_} = 1;
        $fail{$os}{$ssl}{_failed}{$_} = 1;
    }
}

my $os_len = max map { length } keys %fail;
my $ssl_len = max map { length } map { keys %$_ } values %fail;
my $version_len =
  max map { length } map { keys %$_ } map { values %$_ } values %fail;

foreach my $os (sort keys %fail) {
    foreach my $ssl (sort keys %{ $fail{$os} }) {
        foreach my $version (grep { !/^_/ } sort keys %{ $fail{$os}{$ssl} }) {
            printf "%*s %*s %*s: ",
              -$os_len      => $os,
              -$ssl_len     => $ssl,
              -$version_len => $version;

            foreach my $failed (sort { $a <=> $b }
                keys %{ $fail{$os}{$ssl}{_failed} })
            {
                printf "%4s ",
                  $fail{$os}{$ssl}{$version}{_failed}{$failed} ? $failed : '-';
            }

            print "\n";
        }
        print "\n";
    }
}

