/****************************************************************************/
/*                                                                          */
/*                              IAGA_extract.c                              */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* This program extracts data from an IAGA-format data file. The user may   */
/* give start and end times and optionally the station list. The data may   */
/* may be read either from a file or from stdin. Results are written to     */
/* standard output.                                                         */
/*                                                                          */
/* Usage:                                                                   */
/*    IAGA_extract [-s] [-e | -h] [-o] [<] IAGAFile > NewIAGAFile           */
/*         [-s YYMMDDHHMM]      Time of the first record included           */
/*         [-e YYMMDDHHMM]      Time of the record not included anymore     */
/*         [-h HH]              Number of hours included                    */
/*         [-o 'Station list']  List of stations delimited by quotes.       */
/*                              Stations are identified by three-letter     */
/*                              code and separated by exactly one space.    */
/*                              e.g. 'SOR MAS KEV KIL'.                     */
/*                              If missing then all stations included.      */
/*          IAGAFile            Name of IAGA-format file.                   */
/*          NewIAGAFile         Name of generated IAGA-format file.         */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/*                            Lasse Hakkinen                                */
/*                    Finnish Meteorological Institute                      */
/*                        Geophysical Research Division                     */
/*                              P.O.Box 503                                 */
/*                      FIN-00101, Helsinki, Finland                        */
/*                      e-mail: Lasse.Hakkinen@fmi.fi                       */
/*                      phone : (+358)-9-19294634                           */
/*                      fax   : (+358)-9-19294603                           */
/*                                                                          */
/*                      version 1.03         9.9.1999                       */
/****************************************************************************/
/****************************************************************************/
/*  Version history:                                                        */
/*                                                                          */
/*  1.03 09.09.1999 Fixed a Y2K bug in NewTime.h file which resulted in     */
/*                  incorrect year in date strings if year >= 2000.         */
/*  1.02 18.3.1999  Changed -h option so that the argument may be a decimal */
/*                  number so that fractional hours are permitted.          */
/*  1.01 26.2.1996  Cosmetic changes in code. No apparent change in program */
/*                  behaviour.                                              */
/*  1.0  10.10.1995 First official release                                  */
/****************************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Usage.h"
#include "MagnData.h"
#include "IAGA.h"

#define BuffSize 1440               /* Size of one block in an IAGA file */

char *version = "1.03";
char *date = "9.9.1999";

#define HeaderLineCount 4
#define UsageLineCount 15

char *HeaderText[HeaderLineCount] = {
"**************************************************************************",
"This program extracts data for given time interval or for given stations  ",
"from an IAGA format magnetometer data file.                               ",
"**************************************************************************",
};

char *UsageText[UsageLineCount] = {
" [-s] [-e | -h] [-o] [<] IAGAFile > NewIAGAFile",
"      [-s YYMMDDHH]        Time of the first record included. If missing ",
"                           then start of file is assumed.                ",
"      [-e YYMMDDHH]        Time of the record not included anymore.      ",
"                           If missing then end of file is assumed.       ",
"      [-h HH]              Number of hours included. Either -e or -h can ",
"                           be specified, not both. HH may be a decimal   ",
"                           number so that fractional hours are permitted.",
"      [-o 'Station list']  List of stations enclosed in quotes           ",
"                           If missing then all stations included.        ",
"                           Stations are identified by three-letter code  ",
"                           and separated by exactly one space.           ",
"                           e.g. 'SOR KEV KIL'.                           ",
"      IAGAFile             Name of IAGA-format file.                     ",
"      NewIAGAFile          Name of extracted IAGA-format file.           ",
};


/*--------------------------------------------------------------------------*/
/*                          The main procedure                              */
/*--------------------------------------------------------------------------*/

int main(int argc, char *argv[])
{
    long    params;
    long    status = 0;
    long    FileCount = 0;
    char    FileName[100];      /* Name of the original data file           */
    Time_sec Time;              /* Time of the current data block (seconds) */
    Time_sec StartTime = MIN_TIME;  /* Time of first data block (seconds)   */
    Time_sec EndTime   = MAX_TIME;  /* No blocks included after this time   */
    double  HourCount = 0.0;        /* Number of hours included             */
    char    Buffer[BuffSize];   /* Buffer for one data block                */
    char    StationList[200] = "";  /* List of stations from command line   */
    FILE    *IAGAFile;          /* IAGA format data file to be processed    */


    /*==========================*/
    /* Analyse the command line */
    /*==========================*/
    if (argc == 1) {        /* No arguments, show the usage text */
        PrintUsage(argv[0],0,HeaderLineCount,UsageLineCount);
        return OK;
    }

    for (params = 1; params < argc; params++) {
        if (*argv[params] != '-') {
            strcpy(FileName,argv[params]);
            FileCount++;
        } else {
            switch (*(argv[params]+1)) {
                case 's' : StartTime = StrToSecs(argv[++params],0); break;
                case 'e' : EndTime   = StrToSecs(argv[++params],0); break;
                case 'h' : HourCount = atof(argv[++params]);        break;
                case 'o' : strcpy(StationList,argv[++params]);      break;
                default  :
                    fprintf(stderr,"\n### %s: \"%s\" is not an option.\n\n",
                            argv[0], argv[params]);
                    PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount);
                    return FAIL;
                    break;
            }
        }
    }
    
    /*====================================*/
    /* Check the values of the parameters */
    /*====================================*/
    
    if (FileCount > 1) {
        PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount);
        return FAIL;
    }
    if ((HourCount != 0.0) && (EndTime != MAX_TIME)) {
        PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount);
        return FAIL;
    }
    if ((HourCount != 0.0) && (StartTime == MIN_TIME)) {
        PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount);
        return FAIL;
    }
    if (HourCount != 0.0) {
        EndTime = StartTime + (long)(3600*HourCount+0.5);
    }


    /*===========================*/
    /* Try to open the IAGA file */
    /*===========================*/

    if (FileCount == 0) IAGAFile = stdin;
    else {
        if ((IAGAFile = fopen(FileName, "r")) == NULL) {
            fprintf(stderr,"\n### %s - Unable to open file: %s\n",argv[0],FileName);
            return FAIL;
        }
    }

    /*===================================*/
    /* Extract proper data from the file */
    /*===================================*/

    while (ReadIAGABlock(IAGAFile,Buffer) && ((Time = GetIAGATime(Buffer)) < EndTime))
    {
        if ((Time >= StartTime) && StationInList(Buffer+IAGA_StationID,StationList)) {
            WriteIAGABlock(stdout,Buffer);
        }
    }

    if (FileCount == 1) fclose(IAGAFile);
    return OK;
}

