/*
 * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
 *
 * This file is part of Orfeo Toolbox
 *
 *     https://www.orfeo-toolbox.org/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef otbProSailParameters_h
#define otbProSailParameters_h


#include "itkDataObject.h"
#include "itkMacro.h"
#include "itkObjectFactory.h"


namespace otb
{
/** \class ProSailParameters
   * \brief this class implements the ProSailParameters lib.
   *
   * see http://teledetection.ipgp.jussieu.fr/prosail/
   * \sa itk::DataObject
 *
 * \ingroup OTBSimulation
 */

class ITK_EXPORT ProSailParameters : public itk::DataObject
{
   public:
      /** Standard class typedefs */
      typedef ProSailParameters Self;
      typedef itk::DataObject Superclass;
      typedef itk::SmartPointer<Self> Pointer;
      typedef itk::SmartPointer<const Self> ConstPointer;

      /** Standard macros */
      itkTypeMacro(ProSailParameters, DataObject);
      itkNewMacro(Self);


      /** Set/Get Chlorophyll content (ug/cm2)*/
      itkSetMacro(Cab, double);
      itkGetMacro(Cab, double);

      /** Set/Get Carotenoid content (ug/cm2)*/
      itkSetMacro(Car, double);
      itkGetMacro(Car, double);

      /** Set/Get Brown pigment content (arbitrary unit)*/
      itkSetMacro(CBrown, double);
      itkGetMacro(CBrown, double);

      /** Set/Get EWT (cm)*/
      itkSetMacro(Cw, double);
      itkGetMacro(Cw, double);

      /** Set/Get LMA (g/cm2)*/
      itkSetMacro(Cm, double);
      itkGetMacro(Cm, double);

      /** Set/Get structure coef*/
      itkSetMacro(N, double);
      itkGetMacro(N, double);

      /** Set/Get leaf area index */
      itkSetMacro(LAI, double);
      itkGetMacro(LAI, double);

      /** Set/Get average leaf angle (deg)*/
      itkSetMacro(Angl, double);
      itkGetMacro(Angl, double);

      /** Set/Get soil coefficient*/
      itkSetMacro(PSoil, double);
      itkGetMacro(PSoil, double);

      /** Set/Get diffuse/direct radiation*/
      itkSetMacro(Skyl, double);
      itkGetMacro(Skyl, double);

      /** Set/Get hot spot */
      itkSetMacro(HSpot, double);
      itkGetMacro(HSpot, double);

      /** Set/Get solar zenith angle (deg) */
      itkSetMacro(TTS, double);
      itkGetMacro(TTS, double);

      /** Set/Get observer zenith angle (deg) */
      itkSetMacro(TTO, double);
      itkGetMacro(TTO, double);

      /** Set/Get azimuth(deg) */
      itkSetMacro(PSI, double);
      itkGetMacro(PSI, double);


   protected:
      /** Constructor */
      ProSailParameters();
      /** Destructor */
      virtual ~ProSailParameters() {};
      /** PrintSelf method */
      void PrintSelf(std::ostream& os, itk::Indent indent) const override;


   private:
      ProSailParameters(const Self&); //purposely not implemented
      void operator=(const Self&); //purposely not implemented

      double m_Cab; //Chlorophyll content
      double m_Car; //Carotenoid content
      double m_CBrown; //Brown pigment content
      double m_Cw; //EWT
      double m_Cm; //LMA
      double m_N; //structure coef
      double m_LAI; //leaf area index
      double m_Angl; //average leaf angle
      double m_PSoil; //soil coefficient
      double m_Skyl; //diffuse/direct radiation
      double m_HSpot; //hot spot
      double m_TTS; //solar zenith angle
      double m_TTO; //observer zenith angle
      double m_PSI; //azimuth

};
}// end namespace otb

#endif
