/****************************************************************************/
/*                                                                          */
/*                              IAGA_to_GADF.c                              */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* This is a filter program that reads a IAGA format data file and writes   */
/* out the same data in GADF format.                                        */
/*                                                                          */
/* Usage:                                                                   */
/*    IAGA_to_GADF [-s] [-e | -h] [-o] [-p] [<] IAGA_file > GADF_file       */
/*      [-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.                         */
/*      [-p]                This is used when reading data from pipe        */
/*      [-o 'Station list'] List of stations delimited by aposthropes       */
/*                          If missing then all stations included.          */
/*                          Stations are identified by three-letter code    */
/*                          and separated by exactly one space.             */
/*      IAGA_file           Name of IAGA-format file.                       */
/*      GADF_file           Name of GADF-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.04        28.11.2000                      */
/****************************************************************************/
/****************************************************************************/
/*  Version history:                                                        */
/*                                                                          */
/*  1.04 28.11.2000 Fixed a bug in GADF.h where no data was written if      */
/*                  there were less than 180 data points.                   */
/*  1.03 12.06.2000 Added -p option.                                        */
/*  1.02 09.09.1999 Fixed a Y2K bug in NewTime.h file which resulted in     */
/*                  incorrect year in date strings if year >= 2000.         */
/*  1.01 26.02.1996                                                         */
/*      - Cosmetic change in handling the usage text. No apparent change in */
/*        program behaviour.                                                */
/*                                                                          */
/*  1.0  2.2.1995   First official release                                  */
/****************************************************************************/

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

char *version = "1.04";
char *date = "28.11.2000";

#define HeaderLineCount 3
#define UsageLineCount 16

char *HeaderText[HeaderLineCount] = {
"**************************************************************************",
"This program converts magnetometer data from IAGA format into GADF format.",
"**************************************************************************",
};

char *UsageText[UsageLineCount] = {
" [-s] [-e | -h] [-o] [-p] [<] IAGA_file > GADF_file",
"      [-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.                       ",
"      [-p]                 Data is read from pipe. This prevents the     ",
"                           info text from appearing.                     ",
"      [-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'.                           ",
"      IAGA_file            Name of GADF-format file.                     ",
"      GADF_file            Name of IAGA-format file.                     ",
};


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

int main(int argc, char *argv[])
{
    long params;
    long status = 0;
    long FileCount = 0;
    long HourCount = 0;
    char FileName[100]    = "";
    char StartTimeStr[14] = "";
    char EndTimeStr[14]   = "";
    char StationStr[400]  = "";
    Network_struct NETWORK;

    
    /*==========================*/
    /* 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' : strcpy(StartTimeStr,argv[++params]); break;
                case 'e' : strcpy(EndTimeStr,argv[++params]);   break;
                case 'h' : HourCount = atol(argv[++params]);    break;
                case 'p' :                                      break;
                case 'o' : strcpy(StationStr,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) && (strlen(EndTimeStr) > 0)) {
        PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount);
        return FAIL;
    }
    if ((HourCount != 0) && (strlen(StartTimeStr) == 0)) {
        PrintUsage(argv[0],1,HeaderLineCount,UsageLineCount);
        return FAIL;
    }
    if (HourCount != 0) {
        SecsToStr(StrToSecs(StartTimeStr,0)+3600*HourCount,EndTimeStr);
    }


    /*===================================================*/
    /* Read the data from a IAGA format file into memory */
    /*===================================================*/

    status = ReadIAGA(FileName,&NETWORK,StartTimeStr,EndTimeStr,StationStr);

    if (status != 0) {
        if (status == FileError)
            fprintf(stderr,"Error in reading file %s\n",FileName);
        if (status == OutOfMemory)
            fprintf(stderr,"Out of memory while reading IAGA file %s\n",FileName);
        if (status == FileFormatError)
            fprintf(stderr,"%s is not an IAGA format file\n",FileName);
        return FAIL;
    }

    /*==============================================*/
    /* Write the data in GADF format into stdout    */
    /*==============================================*/
    
    WriteGADF(NULL,&NETWORK,NULL,NULL,NULL);

    FreeNetwork(&NETWORK);
    return OK;
}

