#!/usr/bin/env perl
# ==============================================================================
#
# Name:      inx2inx.com
#
# Purpose:   Downgrade 1h to 2h time interval ionosphere files (INX)
#
# Authors:   A. Villiger @ AIUB.UNIBE.CH
#
# Created:   14-Nov-2014
#
# Changes:   03-Jul-2019 SS: Added parseION
#
# =============================================================================


use File::Basename qw(basename);

# Check input arguments and provide help
# --------------------------------------
if (@ARGV != 2 || lc($ARGV[0]) eq '-h')
{
  print("\n  usage: inx2inx.com INP OUT");
  print("\nexample: inx2inx Z1_14285.INX /scratch/Z1_14285.INX\n\n");
  print("    INP: ionosphere file (INX) with 1 hour time interval\n");
  print("    OUT: output where the downgraded ionosphere file will be stored.\n");
  print("     -h: help\n\n");
  exit;
}

$nMode=2;

$IFILE=shift;
$OFILE=shift;

die "invalid arguments\n" unless ($IFILE && $OFILE);
$INT=2;


open $INP, "<", $IFILE;
open $OUT,">",  $OFILE;

if($nMode==1){$ret = &parseION($INP,$OUT);}
elsif($nMode==2){$ret = &parseINX($INP,$OUT);}

if($ret<0){print "Error while resampling $OFILE\n";}

close(INP);
close(OUT);


#
# parse ionosphere (INX) file
#
sub parseINX {
    $INP=shift;
    $OUT=shift;

    $COMMENT="Downgraded from 1h to 2h time interval                      COMMENT             ";

    @DAT=();
    $bStore=0;
    $bEnd=0;
    $nTEC=1;
    $nRMS=1;
    ## READ 1H-FILE
    while(<$INP>){
        chomp;
        if(substr($_,60,13)=~/END OF HEADER/){
            print $OUT $COMMENT."\n";
        } elsif(substr($_,60,8)=~/INTERVAL/){
            if(substr($_,2,4)=~/3600/){
                $_=~s/3600/7200/;
            }else{$bStore=-1;}
        }elsif(substr($_,60,17)=~/# OF MAPS IN FILE/){
            if(substr($_,4,2)=~/25/){
                $_=~s/  25/  13/
            }else{$bStore=-1;}
        }
        if($bStore<0){return -1;}
        print $OUT $_."\n";
        if(substr($_,60,13)=~/END OF HEADER/){ last;}
    }
    while (<$INP>){
        chomp;
        if(substr($_,60,16)=~/START OF TEC MAP/){
            substr($_,0,6) = sprintf "%6i",$nTEC;
            push @DAT, $_;
            next;
        }elsif(substr($_,60,16)=~/START OF RMS MAP/){
            substr($_,0,6) = sprintf "%6i",$nRMS;
            push @DAT, $_;
            next;
        }elsif(substr($_,60,20)=~/EPOCH OF CURRENT MAP/){
            if((substr($_,22,2) % $INT) == 0){
                $bStore = 1;
                push @DAT , $_;
                next;
            }
        }elsif(substr($_,60,14)=~/END OF TEC MAP/){
            substr($_,0,6) = sprintf "%6i",$nTEC;
            $nTEC+=1 unless $bStore==0;
            $bEnd=1;
        }
        elsif(substr($_,60,14)=~/END OF RMS MAP/){
            substr($_,0,6) = sprintf "%6i",$nRMS;
            $nRMS+=1 unless $bStore==0;
            $bEnd=1;
        }
        push @DAT , $_;

        if($bEnd==1){
            $bEnd=0;
            if($bStore==1){
                foreach $l (@DAT){
                            print $OUT $l."\n";
                }
            }
            $bStore=0;
            undef(@DAT);
            @DAT=();
        }
        if(substr($_,60,11)=~/END OF FILE/){
            print $OUT $_."\n";
            return 1;
        }
    }

    return 2;
}


#
# parse IONO file
#
sub parseION {
    $INP=shift;
    $OUT=shift;

    $nn=0;
    $store=0;
    ## READ 1H-FILE
    while(<$INP>){
        if(substr($_,0,4)=~/CODE/){
          if    ($store==0) { $store=1 }
          elsif ($store==1) { $store=0 }
          $nn++ if $store==1;
        }
        next if $store==0;
        if(substr($_,0,12)=~/MODEL NUMBER/){
          $strold = substr($_,49,7);
          $strnew = substr($strold,0,5).sprintf("%2.2i",$nn);
          $_=~s/$strold/$strnew/;
        }
        print $OUT $_;
    }
}


