// bytran -|- spectral calculations for portable devices using the HITRAN database
//
// Developed by Dzianis Pliutau (Denis Plutov) and Kostya Roslyakov
// www.bytran.org | bytran@bytran.org
// Copyright (c) 2016 Dzianis Pliutau
// Distributed under the MIT license
//
// The MIT License (MIT)
// Copyright (c) 2016 Dzianis Pliutau
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
// is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.



// Object stores curently active wavelength units and performs conversion from / to the default wavelength units to the current wavelength units
#ifndef WAVELENGTH_H
#define WAVELENGTH_H

#include <QVector>

class Wavelength
{
public:

    Wavelength();

    // Method to get and set the current total pressure units
    quint8 getUnits();
    void setUnits(quint8 newUnits);

    // Method to convert from default units to current units
    double fromDefaultToCurrent(double defaultValue);

    // Method to convert from the current units to the default units
    double fromCurrentToDefault(double currentValue);

    // Minimum wavenumber
    double getStartWn();
    void setStartWn(double newStartWn);
    // Minimum wavelength in current units (setting and returning)
    double getStartWlCurrUnits();
    void setStartWlCurrUnits(double newStartWlCurrUnits);

    // Maximum wavenumber
    double getEndWn();
    void setEndWn(double newEndWn);
    // Minimum wavelength in current units (setting and returning)
    double getEndWlCurrUnits();
    void setEndWlCurrUnits(double newEndWlCurrUnits);

    // Wavenumber resolution for calculations
    double getWnResol();
    void setWnResol(double newWnResol);
    // Wavenumber resolution for calculations
    double getWlResolCurrUnits();
    void setWlResolCurrUnits(double newWnResol);

    // Method to get and set the number of data points
    quint32 getNumPoints();
    void setNumPoints(quint32 newNumPoints);

    // Distance from the line center in wavenumbers to run calculations up to
    // HAPI equivalent variable is "OmegaWinng"
    double getWnWing();
    void setWnWing(double newWnWing);

    // Distance from the line center in half widths
    // HAPI equivalent variable is "OmegaWingHW"
    double getWnWingHw();
    void setWnWingHw(double newWnWingHw);

    // Variable indicating if the the spectral calcualtion range in the wings is expressed in wavenumbers or fractions of half widths
    bool getWnWingAbs();
    void setWnWingAbs(bool newWnWingAbs);

    // Array with the main wavenumber grid values
    QVector<double> *getWns();
    double getWnsAt(int index);

    // Method to initialize the wavenumber grid based on the staring and ending wavenumbers as well as the wavenumber step
    void initWavenumberGrid();

    // Method to get the axis title for the currently selected units
    QString getAxisTitle();

private:

    double startWn;    // Minimum wavenumber
    double endWn;	   // Maximum wavenumber
    double wnResol;    // Wavenumber resolution for calculations
    int numPoints;     // Number of data points to use in the calculation

    double wnWing;     // Distance from the line center in wavenumbers to run calculations up to
    double wnWingHw;   // Distance from the line center in half widths
    bool wnWingAbs;    // Variable indicating if the the spectral calcualtion range in the wings is expressed in wavenumbers or fractions of half widths

    quint8 currentUnits;  // 0 - Wavelength, nm;  1 - Wavenumber, cm-1;  2 - Frequency, Hz;  3 - Attenuation, Db

    QVector<double> wns;  // Array with the main wavenumber grid values

    QVector <QString> axisTitles;  // Variable containing the axis titles

};

#endif // WAVELENGTH_H
