#!/opt/perl/bin/perl
use GOA::Util;
use GPS::PRN_GPS;
use GOA::PostfitLog;
my %stats;
my $file = shift || 'postfit.log';
my $date = shift || 'today';
my $verb = shift || '';
my $pf = GOA::PostfitLog->new($file);
my $pg = GPS::PRN_GPS->new();
my $stats = $pf->stats('by_sat');
my $site = uc 'albh';
my @sigs;

foreach my $h ( sort { $b->{sigma} <=> $a->{sigma} }  @{$stats} ) {
  #next if $h->{site} ne $site;
  next if ! exists $h->{LC}; 
  my $sigma = $h->{sigma}*1e6;
  my $np = $h->{num_pts};
  my $w = $np/$sigma;
  my $sat = unpack('x3a2',$h->{sat});
  push @sigs,$sigma;
  #print "$sat $sigma $np $w\n";
}
my $sig_max =0;
my $m=median(@sigs);
print "# median: $m\n" if $verb;
my %bad_sat=();
my @bad_sats = ();
foreach my $h ( sort { $b->{sigma} <=> $a->{sigma} }  @{$stats} ) {
  next if ! exists $h->{LC}; 
  my $sigma = $h->{sigma}*1e6;
  #my $w = sprintf "%d",100*abs($sigma/$m - 1);
  my $w =weight($sigma,$m);
  my $np = $h->{num_pts};
  my $gps = unpack('x3a2',$h->{sat});
  #my $prn = `gps2prn $gps`; chomp $prn;
  my $prn = $pg->prn( gps => $gps, date => $date );
  print "# $gps $prn $sigma $np $w\n" if $verb;
  #next if $w < 40;
  $bad_sat{$gps}={ sigma => $sigma , w => $w, np => $np , prn => $prn }; 
  #push @bad_sats,$gps;
}

my ($sat)  = sort { $bad_sat{$b}{sigma}  <=> $bad_sat{$a}{sigma} } keys %bad_sat;
my $wsat = $sat;
$sig_max = $bad_sat{$wsat}{sigma};
$m = median( map { $bad_sat{$_}{sigma} } keys %bad_sat) ;
#while ( $bad_sat{$sat}{sigma} >= 1.8*$m ) {
while ( weight($bad_sat{$sat}{sigma},$m) > 70 ) {
   $w = weight($bad_sat{$sat}{sigma},$m);
   push @bad_sats,$sat;
   print "# $sat $bad_sat{$sat}{prn} $bad_sat{$sat}{sigma} $bad_sat{$sat}{np} $w \n" if $verb;
   delete $bad_sat{$sat};
   #($sat)  = sort { $bad_sat{$b}{sigma}  <=> $bad_sat{$a}{sigma} } keys %bad_sat;
   ($sat)  = sort { $bad_sat{$b}{sigma}  <=> $bad_sat{$a}{sigma} } keys %bad_sat;
   $wsat = $sat;
   $sig_max = $bad_sat{$wsat}{sigma};
   $m = median( map { $bad_sat{$_}{sigma} } keys %bad_sat) if $m > 15;
   print "# median: $m \n" if $verb;
}
#print "$m $bad\n";
#@bad_sats = sort { $a <=> $b } @bad_sats;
#print join (',',@bad_sats),"\n";
print map { "$_\n" } @bad_sats;
#print $bad_sats[0],"\n";
sub weight {
  my $sigma = shift;
  my $m = shift;
  return sprintf("%d",100*($sigma/$m - 1));
}
sub median {
  my @v = sort { $a <=> $b } @_;
  my $n = @v;
  my $half= int(@v/2);
  return  @v % 2 ? $v[$half] : ($v[$half-1]+$v[$half])/2;
}
