#ifndef _RINEX_H_
#define _RINEX_H_

#include "navi/navicommon.h"
#include "navi/rinexbase.h"

class DecodeRnx303 : public RnxBase{
public: // constructors
    DecodeRnx303();
    virtual ~DecodeRnx303();

public: // main functions
    /*********************************************
     * decode rinex files
     * @param   infiles [in]    rinex files
     * @param   opt     [in]    processing options
    **********************************************/
    int decode(char* infiles);

protected: // observation reader
    int readobsh(ifstream &in);
    int readobsb(ifstream &in, int obsnum);
    int readfreqtype(ifstream &in, string line, int sysflag);

protected:
    int readephh(ifstream &in);
    int readephb(ifstream &in);
    int readgpseph(ifstream &in, string &line, int ephnum);
    int readbdseph(ifstream &in, string &line, int ephnum);

    /***************************************
     * scan file to get total nav satellite
     * @param   in  [in]    file stream
     * @return  total sats
    ***************************************/
    int scannav(ifstream &in);

protected: // helper
    /***********************************************
     * transfer char to navigation system (SYS_???)
     * @param   code    sys code
     * @return  system code (SYS_???)
    ***********************************************/
    int code2sys(char code);

    /************************************************
     * transfer code to frequency type(FREQTYPE_???)
     * @param   code    freq type
     * @return  frequency type
    ************************************************/
    int code2freqnum(int code);

    /***********************************************
     * scan rinex ovservation files to acquire 
     * total observation epochs
     * @param   in  rinex observation file
     * @return  total observation epochs
    ***********************************************/
    int scanobsfile(ifstream &in);

    /*************************************************
     * transfer string to epoch
     * @param   sitenum [in]    which site 
     * @param   epoch   [in]    epoch nums
     * @param   line    [in]    a line start with ">"
     * @return  satellite nums
    *************************************************/
    int decodeEpoch(int sitenum, int &epoch, string line);

    /************************************************
     * decode observation record
     * @param   in      [in]    file stream
     * @param   sitenum [in]    site number
     * @param   satnum  [in]    satellite nums
     * @param   epoch   [in]    epoch num
     * @return  true if success
    ************************************************/
    bool decodeobsr(ifstream &in, int sitenum, int satnum, int &epoch);

private:
    const char freqcode_[MAXSYS][MAXFREQ+1] = {
        FREQCODE_GPS,   // GPS
        "267"           // BDS in rinex 304
    };
};

#endif