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

  $progname proj_name
 
Ex.
   $progname pnw
EOT
my $here = cwd;
my $proj = shift or 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 = "$here/comb";
if ( ! -d $comb_dir ) { mkdir $comb_dir or die "Couldn't make $comb_dir $!\n"; }

`\\rm -f $comb_dir/*`;

foreach my $f ( @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" );
   #$stacov->print;
}

sub parse_lines {
  my $stacov = shift;
  my @lines = @_;
  my ( $i,$j,$site,$par,$comp,$n_p,$p,$p_sig,$date,$err);
  my $pname='';
  my $cc = {} ;
  my $cov = {} ;
  my %Par = ();
  my $n = 0;
  my $npar=0;
  my $cname='';
  my $flag = 0;
  my $chis=1.0;
  while ( my $l = shift @lines ) {
      chomp $l;
      if ( $l =~ /N=\s+(\d+)\s+PARAMETERS/ ) {   
         $npar = $1;
      }
      elsif ( $l =~ /CHI.2..DOF=(.*)$/ ) {
         $chis = $1+0;
      }
      elsif ( $l =~/^INPUT FILE:.*(....)\.([xyz])$/ ) {
         $site = uc $1;
         $comp = uc $2;
         $n+=$npar if $comp eq 'Y' || $comp eq 'Z';
      }
      elsif ( $l =~ /^COV/ ) {
        my (undef,$ii,$jj,$c) = split ' ', $l;
        $i = $n+$ii; $j=$n+$jj;
        $cov->{$i}{$j} = $c*$chis;
        #print "$i $j $cov->{$i}{$j}\n";
        #$stacov->{cc}{$i+$np}{$j+$np}=$Sxx/($Sx*$Sy);
      }
      elsif ( $l =~ /((POS|VEL|AMP.*ANNUAL SIN|AMP.*ANNUAL COS|OFFSET|OFFSET-EVENT).*$)/ ) { 
        $par = trim($2);
        $pname = $names{$par};
        #( $n_p,$p,$p_sig,$err) =  (split( ' ', $l) )[0,2,4,5];
        ( $n_p,$p,$p_sig,$err,$date) =  (split( ' ', $l) )[0,2,4,5,7];
        $n_p =~ s/P//; $n_p+=0;
        $date = $par eq 'POS'    ? get_date($date,'epoch') :
                $par =~ /OFFSET/ ? get_date($date,'%y%j')  : '';
        $stacov->date($date) if ! $stacov->date && $par eq 'POS';
        $cname = $par =~ /OFFSET/ ? "$comp $date": $comp;
        $cname = sprintf"%-7s",$cname;
	$scl = 1.0;
	#$scl = $par eq 'VEL' ? 1.0 : 1e-3;
        $Par{par}{$n+$n_p} = { site  => $site,
                               pname => $pname,
                               cname => $cname,     
                               val   => $p*$scl,     
                               sig   => $p_sig*$scl
                           };
     }
  }
  $n+=$npar;
  $stacov->npar($n) ;
  $stacov->{par}=$Par{par};
  for my $i ( 2 .. $n ) {
     for my $j ( 1 .. $i-1 ) {
        $stacov->{cc}{$i}{$j} = 1e-3 if ! exists $cov->{$i}{$j} ;
        $stacov->{cc}{$i}{$j} = $cov->{$i}{$j}/$cov->{$i}{$i}/$cov->{$j}{$j};
     }
  }
  $stacov->reorganize(1);

}

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=|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
}
