/*----------------------------------------------------------------------------*/
/*!
Copyright (c) 2018, 2019 by Christian Nowak a.k.a. Creestee a.k.a. chn
Contact: chnowak@web.de or creestee@creestee.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. This application may be used and redistributed in source code and binary
form free of charge for personal and for educational purposes.
4. Redistribution and usage of this application in source code or binary form
for commercial purposes requires explicit written permission from the
author.


THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the RadarVolumeExplorer project.
*/
/*----------------------------------------------------------------------------*/
#ifndef RVERAWDATA_H
#define RVERAWDATA_H

#include <QObject>
#include <QMap>
#include <QGLFunctions>
#include <QDateTime>

#include "RveHDF5/RveHDF5Group.h"

/*---------------------------------------------------------------------------*/
/*!
\class
\brief
*/
/*---------------------------------------------------------------------------*/
class RveRawdata : public QObject
{
   Q_OBJECT

public:
   RveRawdata( const QString &fname, QObject *parent = 0 );
   ~RveRawdata();

   bool loadVolume( const QString &dataMoment );

   bool isLoaded() const;
   bool isValid() const;

   QStringList availableDataMoments() const;

   double beamHeight( double distance, double elevation );
   QList<double> elevations() const;
   QMap<double, QVector<double> > *slice( double elevation );
   double range() const;
   double lon() const;
   double lat() const;
   QString sensorName() const;

   QString text() const;

   double rangeStep( double elevation ) const;
   double numBins( double elevation ) const;
   double startRange( double elevation ) const;
   double stopRange( double elevation ) const;
   double minValue() const;
   double maxValue() const;
   void nearestElevation( double elevation, double height, double &elLower, double &elUpper, double &scale ) const;
   double nearestAzimuth( double elevation, double azimuth ) const;
   QString dataMoment() const;

private:
   bool loadHdf5( const QString &fname );
   void clearVolume();

   static bool isOdim22( const RveHDF5Group *pHdf );
   static bool isKnmi36( const RveHDF5Group *pHdf );

   bool loadMetadataOdim22( const RveHDF5Group *pHdf );
   bool loadVolumeOdim22( const RveHDF5Group *pHdf, const QString &dataMoment );

   bool loadMetadataKnmi36( const RveHDF5Group *pHdf );
   bool loadVolumeKnmi36( const RveHDF5Group *pHdf, const QString &dataMoment );

   static bool getGainOffset( const QString &calibString, double &gain, double &offset );

   RveHDF5Group                                 *m_pHdf5;
   QStringList                                   m_AvailableDataMoments;
   QString                                       m_DataMoment;
   bool                                          m_Loaded;
   bool                                          m_Valid;

   double                                        m_MinValue;
   double                                        m_MaxValue;

   double                                        m_Longitude;
   double                                        m_Latitude;
   QString                                       m_FileName;

   QDateTime                                     m_DateTime;
   QString                                       m_SensorName;
   // Height of the sensor above sea level
   double                                        m_SensorHeight;
   double                                        m_Range;
   /*** The actual Volume Data                               ***/
   //   elevation    azimuth         bin data
   QMap<double, QMap<double, QVector<double> > > m_VolumeData;
   QVector<double>                               m_Elevations;
   QMap<double, QVector<double> >                m_Azimuths;

   //   elevation    numBins
   QMap<double,      int>                        m_NumBins;
   //   elevation    range step (m)
   QMap<double,      double>                     m_RangeSteps;
   //   elevation    start range (m)
   QMap<double,      double>                     m_StartRanges;
   //   elevation    stop range (m)
   QMap<double,      double>                     m_StopRanges;
   /***                                                      ***/
};

#endif
