#!/opt/perl/bin/perl
use Smart::Comments;
use File::Basename;
use GPS::DATES;
use GOA::Stacov;
use GPS::StrUtil;
use Matrix;
use Cwd;
my $progname = basename $0;
my $usage=<<EOT;
Usage:

  $progname [site] [path_to_comb_dir] [-h]
 
Ex.
   $progname albh
EOT
my $here = cwd;
if ( grep { /-h/i } @ARGV ) {
  die $usage;
}
my $ss = shift || '';

my $dir = "$here/fit.xyz";
my @xyz = qw/X Y Z/;
my %names = ( POS => 'STA',
              VEL => 'VEL',
              'AMPANNUAL SIN'      => 'AAS',
              'AMPSEMI-ANNUAL SIN' => 'ASS',
              'AMPANNUAL COS'      => 'AAC',
              'AMPSEMI-ANNUAL COS' => 'ASC',
              'OFFSET'  => 'JMP',
              'OFFSET-EVENT' => 'OFF',
             );
my @pnames = qw/STA VEL AAS AAC ASS ASC JMP OFF/;
my @files = get_files($dir);
@files = grep /$ss/, @files if $ss;
my $comb_dir = shift || "$here/comb";
if ( ! -d $comb_dir ) { mkdir $comb_dir or die "Couldn't make $comb_dir $!\n"; }

#`\\rm -f $comb_dir/*`;
unlink grep { /[\.[xyz]/ } glob("$comb_dir/*") if ! $ss;

foreach my $f ( sort @files ) { # # # generating site stacovs [===|   ] %done
   my $site = unpack 'a4', $f;
   my $stacov= GOA::Stacov->new();
   my @lines = get_lines("$dir/$f");
   next if ! @lines;
   parse_lines($stacov,@lines);
   $stacov->print( file => "$comb_dir/$site.comb.stacov" );
}

sub parse_lines {
  my $stacov = shift;
  my @lines = @_;
  my ($site,$comp,$n_p,$p,$p_sig,$date,$err,$ti,$tf,$tspan,$rms,$std_dev,$mean);
  my $pname='';
  my $n = 0;
  my $npar=0;
  my $cname='';
  my %par =();
  my %c=();
  my $k=0;
  my $kk=0;
  for  ( @lines ) {
      chomp;
      s/#.*$//;
      s/^\s+//;
      s/\s+$//;
      next unless length;

      if ( /^N=/ ) {
         (undef,$npar) = split(' ');
          $n+=$npar;
      }
      elsif ( /^INPUT FILE:\s+(.*?)([A-Z0-9_]{4})\.([xyz])$/ ) {
         $comp = uc $3;
         $site = $2;
         $k++;
      }
      elsif ( /TIME INTERVAL=\s(.*?)\s-\s(.*?)\s=\s(.*)/ ) {
         $tspan = trim($3);
      }
      elsif ( /RMS=(.*?)SDEV=(.*?)MEAN=(.*?)$/ ) {
        $rms = trim($1);
      }
      elsif ( /^COV/ ) {
        my (undef,$i,$j,$Sxx) = split(' ');
        $kk = ($k-1)*$npar; 
        $i += $kk;
        $j += $kk;
        $c{$i}{$j}=$Sxx;
      }
      elsif ( /(POS|OFFSET|OFFSET-EVENT|VEL|AMP[A-Z\-]+ (SIN|COS))/ ) { 
        my $par = trim($1);
        $pname = $names{$par};
        #( $n_p,$p,$p_sig,$date) =  (split( ' ', $l) )[0,2,4,7];
        my @f = split(' ');
        ( $n_p,$p,$p_sig) =  @f[0,2,4,7];
        $n_p =~s/P+//;
        $date = $f[-1];
        $date = $par eq 'POS'    ? get_date($date,'epoch') : 
                $par =~ /OFFSET/ ? get_date($date,'%y%j')  :
                                   '';

        $stacov->date($date) if $par eq 'POS';
        $cname = $par =~ /OFFSET/ ? "$comp $date": $comp;
        $cname = sprintf"%-7s",$cname;
        $scl =  1.0;
        if ( $par eq 'VEL' ) {
          $scl = 1.0e3;
          $p_sig = $rms/$tspan;
          #print "$site $p_sig_ $p_sig $rms $tspan\n";
        }
        $kk = ($k-1)*$npar;
        $stacov->{par}{$n_p+$kk}{site} = $site;
        $stacov->{par}{$n_p+$kk}{pname} = $pname;
        $stacov->{par}{$n_p+$kk}{cname} = $cname;
        $stacov->{par}{$n_p+$kk}{val} = $p*$scl;
        $stacov->{par}{$n_p+$kk}{sig} = $p_sig*$scl;
      }
  }
  $stacov->npar($n);
  $stacov->{cc}=\%c;
  $stacov->reorganize();
  #$stacov->print();
  #return %s
}

sub get_files {
  
  my $dir = shift || "$here/fit";
  
  opendir(my $dh, $dir) or die "Coulnd't open $dir $!\n";

  my @files = grep { /\.fit\./ } readdir($dh);

  return @files
}

sub get_lines {
   my $f = shift;
   
   open(my $fh, "< $f") or die "Couldn't open $f $!\n";
   
   my  @lines = grep { /^(N=|INITIAL|RMS|P\d+\s+=|COV|INPUT)/ } <$fh>;
   
   close($fh);
   
   my $npos = grep { /POS/ } @lines;
   my $nvel = grep { /VEL/ } @lines;
   @lines = () if $npos != 3 || $nvel != 3;
   return @lines
}
