#!/usr/bin/env perl

use strict;
use warnings;

my $bookkeeping;
my $flt = '[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?';
my $pflt = "($flt)";
my $prefix = '^\[([^: ]+)(?::loba:\(\d+\))? ' . $pflt . '\] \[proc/INFO\] ';
my $initmatch = $prefix . 'Initial load: ' . $pflt . '';
my $finalmatch;
my $plainmatch;

my %alldata = ();

while (<>) {
    chomp;
    if (s{^(?:\[0\.0+\] )?\[main/INFO\] \| bookkeeping\.*: }{}) {
        $bookkeeping = $_ eq "on";
        if ($bookkeeping) {
            $finalmatch = $prefix .
                'Final load after (\d+):(\d+) iterations: ' . $pflt .
                ' ; expected: ' . $pflt;
            $plainmatch = $prefix .
                '\((\d+):(\d+)\) current load: ' . $pflt .
                ' ; expected: ' . $pflt;
        } else {
            $finalmatch = $prefix .
                'Final load after (\d+) iterations: ' . $pflt;
            $plainmatch = $prefix . '\((\d+)\) current load: ' . $pflt;
        }
        if (0) {
            print STDERR "BOOKKEEPING: \"$_\" ($bookkeeping)\n";
            print STDERR "INITMATCH..: \"$initmatch\"\n";
            print STDERR "PLAINMATCH.: \"$plainmatch\"\n";
            print STDERR "FINALMATCH.: \"$finalmatch\"\n";
        }
    }
    next if not defined $bookkeeping;
    if (m{$plainmatch}) {
        my $host = $1;
        my $data;
        if ($bookkeeping) {
            $data = {
                time     => $2,
                lb       => $3,
                comp     => $4,
                load     => $5,
                expected => $6,
            };
        } else {
            $data = {
                time     => $2,
                lb       => $3,
                comp     => $3,
                load     => $4,
                expected => $4,
            };
        }
#        print STDERR "PUSH $host $data->{time} $data->{load} (plain)\n";
        push @{$alldata{$host}}, $data;
    } if (m{$initmatch}) {
        my $host = $1;
        my $data = {
            time     => $2,
            lb       => 0,
            comp     => 0,
            load     => $3,
            expected => $3,
        };
#        print STDERR "PUSH $host $data->{time} $data->{load} (init)\n";
        push @{$alldata{$host}}, $data;
    } elsif (m{$finalmatch}) {
        my $host = $1;
        my $data;
        if ($bookkeeping) {
            $data = {
                time     => $2,
                lb       => $3,
                comp     => $4,
                load     => $5,
                expected => $6,
            };
         } else {
             $data = {
                time     => $2,
                lb       => $3,
                comp     => $3,
                load     => $4,
                expected => $4,
             };
         }
#        print STDERR "PUSH $host $data->{time} $data->{load} (final)\n";
        push @{$alldata{$host}}, $data;
    }
}

foreach my $host (sort(keys %alldata)) {
#    print STDERR "GOT \"$host\"\n";
    my $datalist = $alldata{$host};
    print "# $host\n";
    foreach my $data (@{$datalist}) {
        print "$data->{time} $data->{load}\n";
    }
    print "\n"
}
