/****************************************************************************/
/*                                                                          */
/*                              IAGA_to_WDC.c                               */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* This is a filter program that reads an IAGA-format data file and writes  */
/* out the same data in WDC format.                                         */
/*                                                                          */
/* Usage:                                                                   */
/*    WDC_to_IAGA [-s] [-e | -h] [-o] IAGA_file [<] IAGA_file > WDC_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.                         */
/*      [-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.                       */
/*      WDC_file            Name of WDC-format file.                        */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/*                            Lasse Hakkinen                                */
/*                    Finnish Meteorological Institute                      */
/*                        Department of Geophysics                          */
/*                              P.O.Box 503                                 */
/*                      FIN-00101, Helsinki, Finland                        */
/*                      e-mail: Lasse.Hakkinen@fmi.fi                       */
/*                      phone : (+358)-9-19294634                           */
/*                      fax   : (+358)-9-19294603                           */
/*                                                                          */
/*                      version 1.02        9.9.1999                        */
/****************************************************************************/
/****************************************************************************/
/*  Version history:                                                        */
/*                                                                          */
/*  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.2.1996                                                          */
/*      - Cosmetic change in handling the usage text. No apparent change in */
/*        program behaviour.                                                */
/*                                                                          */
/*  1.0  13.11.1995 First official release                                  */
/****************************************************************************/

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

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

#define HeaderLineCount 3
#define UsageLineCount 14

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

char *UsageText[UsageLineCount] = {
" [-s] [-e | -h] [-o] [<] IAGA_file > WDC_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.",
"      [-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 IAGA-format file.",
"      WDC_file             Name of WDC-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[200]   = "";
    StationPtr Station;
    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 '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 an IAGA format file into memory */
    /*====================================================*/

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

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

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

    FreeNetwork(&NETWORK);
    return OK;
}

