#!/usr/bin/perl

use strict;
use DirHandle;
use Date::Parse;
use IO::Handle;
STDOUT->autoflush(1);

my $data_dir='/mnt/data/testdaq';

my $last_run_dir=last_run($data_dir);
my $last_hit_file=<$last_run_dir/*.hit>;
$last_run_dir=~ /\d+/;
my $last_run_num=$&;
my $last_run_log="$last_run_dir/testdaq.log";

open(LOG,"<$last_run_log") || die "Can't open '$last_run_log': $!";
my $last_run_start;
my $last_run_steering;
while(<LOG>){
  if(/NEW TESTDAQ RUN\s*(.*?\s+\d{4})/){
    $last_run_start=str2time($1);
  }elsif(/^COMMAND.*?CommandLine\s+(.*?\.xml)/){
    $last_run_steering=$1;
    last;
  }
}
close(LOG);

open(STEERING,"<$last_run_steering") || die "Can't open '$last_run_steering': $!";
my $last_run_duration;
while(<STEERING>){
  if(/executiontime.*?(\d+)/i){
    $last_run_duration=$1;
    last;
  }
}
close(STEERING);

my $last_run_modified=(stat($last_run_dir))[9];
my $sec_overdue;
my $msg.=
  "Latest Run                  : $last_run_num\n" .
  "Run start time              : " . 
  localtime($last_run_start) . "\n" .
  "Run duration                : $last_run_duration\n" .
  "Date now                    : " . localtime() . "\n";
if((my $elapsed_run_time=(time() - $last_run_start)) < $last_run_duration){
  $msg.= "Elapsed run time            : $elapsed_run_time\n";
  $msg.= "Run time remaining          : " . 
    ($last_run_duration-$elapsed_run_time) . "\n";
}else{
  $sec_overdue=-($last_run_duration - $elapsed_run_time);
  $msg.= "Sec since run should have finished: $sec_overdue" . "\n";
}
$msg.=
  "Directory last modified     : " . localtime($last_run_modified) . "\n" .
  "Time since last modification: " . (time - $last_run_modified) . " sec\n" .
  "Hit file last modified      : " . 
  localtime((stat($last_hit_file))[9]) . "\n" .
  "Time since last modification: " . 
  (time - (stat($last_hit_file))[9]) . " sec\n";
my $size1=(stat($last_hit_file))[7];
$msg.=
  "Size now                    : $size1\n" .
  "Waiting 15 sec ";
for(my $i=0;$i<15;$i++){
  sleep(1);
  $msg .=".";
}
my $size2=(stat($last_hit_file))[7];
$msg .="\n" .
  "Size now                    : $size2\n" .
  "Data rate                   : " . sprintf("%d bytes/sec",($size2-$size1)/15) . "\n" .
  "Errors in this run          :\n";
$msg.=`grep -i -e error -e exception -e requested $last_run_dir/*log`;
if($sec_overdue>900){
  open(MAIL,"|mail -s \"ERROR: TestDAQ Run $last_run_num hangs\" wo\@amanda.spole.gov") ||
    die "Can't open mail process: $!";
  print MAIL "The latest TestDAQ run ($last_run_num) seems to hang. " .
    "It should have finished $sec_overdue sec ago. " .
    "Please restart the DAQ from scratch.\n\n$msg";
  close(MAIL);
}

sub last_run($) {
   my $dir = shift;
   my $dh = DirHandle->new($dir)   or die "can't opendir $dir: $!";
   my @runs=reverse sort #{ (stat($b))[9] <=> (stat($a))[9] }
     # sort pathnames
     map  { "$dir/$_" }         # create full paths
     grep {  /output[\d]{6}/   }  # filter out dot files
     $dh->read( );              # read all entries
   if(0==$#runs){
     return;
   }else{
     @runs[0];
   }
}
