#!/opt/perl/bin/perl
use strict;
use GPS::DATES;
use GPS::Defaults;
use GOA::Util;
use File::Basename;
use Pod::Text::Termcap;
use Getopt::Long;
my $progname = basename $0;
my ($help,$date,$show,$name,$date);
my $fname='summary.log';
my $args = @ARGV;
my $today=get_date('today','cal,time');

GetOptions(  'o:s'   => \$fname,
             'show'  => \$show,
             'name:s' => \$name,
             'date:s' => \$date,
             'help'   => \$help,
           ) or die "Error in options\n";

if ( ! $args || $help ) {
  usage();
  exit 1;
}
my %dtype=( 120 => 'PHASE' , 110 => 'RANGE' );
my ($site,$phase_rms,$range_rms,$npts,$slips,$tslips);
my ($n110,$n120,$dppp,$damb,$pchi,$achi);
my ($startD,$stopD,$iep,$oep,$iint,$oint);
my %stats=();
$pchi=smap_stats('smapper.log');
$achi=smap_stats('smap_fixed.log');
qfront_stats();
delta_pos_stats();
postbreak_stats();
postfit_stats();
point_stats();

unlink $fname;
open(FMT,">> $fname");
format FMT_TOP =
 +--------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | SUMMARY FOR       : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                                                                                        |
                       $name
 | DATE              : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                                                                                        |
                       $date
 | PPP CHI-SQUARE    : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                                                                                        |
                       $pchi
 | AMB CHI-SQUARE    : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                                                                                        |
                       $achi
 | TOTAL CYCLE SLIPS : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                                                                                        |
                       $tslips
 +--------------------------------------------------------------------------------------------------------------------------------------------------------------+
 |       PHASE     RANGE      NUM     CYCLE   PHASE RANGE  DPOS     DPOS     QM     QM out  QM in   RNX     RNX                       RNX                       |
 | SITE  RMS (mm)  RMS (mm)   PTS     SLIPS   OUTLR OUTLR  PPP (m)  AMB (m)  INTRV  EPOCHS  EPOCHS  INTRV   StartDate                 EndDate                   |
 +--------------------------------------------------------------------------------------------------------------------------------------------------------------+
.

format FMT =
   @<<<< @<<<<<<<  @<<<<<<<<  @<<<<<  @<<<<<  @<<<< @<<<<  @<<<<<<  @<<<<<<  @<<<   @<<<<<< @<<<<<< @<<<    @<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
   $site,$phase_rms,$range_rms,$npts,$slips,$n120,$n110,$dppp,$damb,$oint,$oep,$iep,$iint,$startD,$stopD
.

foreach $site ( sort keys %stats ) {
	print "Reading site $site\n";
   $range_rms=$stats{$site}{RANGE}{RMS} || 0;
   $phase_rms=$stats{$site}{PHASE}{RMS} || 0;
   $npts=$stats{$site}{PHASE}{NPTS} || 0;
   $slips=$stats{$site}{SLIPS} || 0;
   $n110=$stats{$site}{RANGE}{OUTLIERS} || 0 ;
   $n120=$stats{$site}{PHASE}{OUTLIERS} || 0;
   $dppp=$stats{$site}{DPOS}{PPP} || 0.0;
   $damb=$stats{$site}{DPOS}{AMB} || 0.0;
   ($startD,$stopD,$iep,$iint) = @{$stats{$site}{RNX}}{qw(SDATE EDATE EPOCHS INTERVAL)};
   ($oep,$oint) = @{$stats{$site}{QM}}{qw(EPOCHS INTERVAL)};
   write FMT;
}
close FMT;

print slurp($fname) if $show;

sub qfront_stats {
  my @files = glob("qfront*log");
  foreach my $f ( @files ) {
     foreach ( slurp($f) ) {
        if ( /USING STATION NAME: (....)/ ) {
          $site = $1;
        }
        if ( /Selecting data from.*= (.*)$/  ) {
           $startD=$1;
        }
        if (  /     to            .*= (.*)$/ ) {
           $stopD=$1;
        }
        if ( /Total number of\s+input epochs =\s+(.*)$/ ) {
           $iep=$1;
        }
        if ( /Total number of\s+output epochs =\s+(.*)$/ ) {
           $oep=$1;
        }
        if ( /INPUT INTERVAL =\s+(.*)\./ ) {
           $iint=$1;
        }
        if ( /OUTPUT INTERVAL =\s+(.*)\./ ) {
           $oint=$1;
        }
     }
     print "Site $site\n";
     @{$stats{$site}{RNX}}{qw(SDATE EDATE EPOCHS INTERVAL)} = ($startD,$stopD,$iep,$iint);
     @{$stats{$site}{QM}}{qw(EPOCHS INTERVAL )} = ($oep,$oint);
  }
}

sub smap_stats {
   my $f = shift || 'smapper.log';
   my $chi = 0;
   return $chi if ! -e $f;
   foreach ( slurp($f) ) {
     if ( /APPROXIMATE CHI-SQUARE:\s*(.*)$/ ) {
       $chi=$1;
     }
   }
   return $chi
}
sub delta_pos_stats {
   my $f = 'estimation.stacov';
   if ( ! -e $f ) {
     ($f)= grep { /(itrf|igs|igb)/i } glob("*.stacov");
     #($f)=glob("*.raw.stacov");
   }
   if ( -e $f ) {
     foreach ( `delta_pos -i $f` ) {
       ($site,$dppp)=split(' ',$_);
       $stats{$site}{DPOS}{PPP}=$dppp;
     }
   }
   ($f)=glob("*fix.stacov");
   if ( -e $f ) { 
     foreach ( `delta_pos -i $f` ) {
       ($site,$damb)=split(' ',$_);
       $stats{$site}{DPOS}{AMB}=$damb;
     }
   }
}

sub point_stats {
   my $f = shift || 'point.log';
   my @lines=();
   my $flag=0;
   my $d;
   return if ! -e $f;
   foreach my $l ( slurp($f) ) {
      $flag=1 if $l =~ /\$POINT/;   
      $flag=0 if $l =~ /\$END/;   
      if ( $flag ) {
         push @lines,$l;
      }
      else {
        foreach ( @lines ) {
          if ( /^\s+RECV\s*=\s*'(....)\s+'/ ) {
             $site = $1;
          }
          if ( /^\s+DATYPE\s*=\s*(...)/ ) {
            $d = $dtype{$1}; 
          }
        }
        $stats{$site}{$d}{OUTLIERS}++;
      }
   }
}

sub postbreak_stats {
   my $f = shift || 'postbreak.log';
   return if ! -e $f;
   my @lines = slurp($f);
   my $new_slips = grep { /new   / } @lines;
   my %slips=();
   my ($site,$sat);
   foreach ( @lines ) {
      next if ! /mrg\s+\d/;
      ($tslips,$site,$sat)=(split(' ',$_))[1,5,6];
      $slips{$site}++;
   }
   foreach my $s ( keys %slips ) {
     $stats{$s}{SLIPS}=$slips{$s};
   }
}

sub postfit_stats {
   my $f = shift || "postfit.log";
   return if ! -e $f;
   my ($d,$site,$mu,$sig,$pts,$mean,$rms,$n,$i,$var);
   $n=0;
   $i=0;$var=0;
   my @s;
   foreach my $l ( slurp($f) ) {
      $l =~ s/^\s+//;
      $l =~ s/\s+/ /g;
      next if $l =~ /\*+/;
      $i++ if $l =~ /DATA/ ;
      next if $i < 3; 
      last if $i > 3;
      next if $l !~ /^(120|110) /;
     ($d,$site,$mu,$sig,$pts)  = split(' ',$l);
     $d=$dtype{$d};
     @{$stats{$site}{$d}}{qw/MEAN RMS NPTS OUTLIERS/} = ($mu*1e6,$sig*1e6,$pts,0);
}



}


sub usage {
  my $pod=Pod::Text::Termcap->new();
  $pod->parse_from_filehandle(man_page());
}

sub man_page {
my $man =qq(
=head1 NAME

$progname

Processing statistics from a ppp or amb processing

=head1 OPTIONS

=over 3

=item -o output_file

=item -name name    

Name of network or site

=item -date date

Processing date.

=item -show 

Prints the saved output_file to STDOUT.

=back

=head1 EXAMPLES

=over 3

$progname -o 2009-01-01.albh.summary.log -name albh -date 2009-01-01


=back

=head1 AUTHOR

Victor Marcelo Santillan <marcelo\@geology.cwu.edu>

=head1 COPYRIGHT

Copyright \(c\) 2009

Central Washington University

=cut
);
open(my $fh,"<",\$man ) or die "$!\n";
return $fh
}

