//**************************************************************************************************
//                                          Config.hpp                                             *
//                                         ------------                                            *
// Description : This class is an application specific interface to the wxWidget wxConfig object.  *
// Started     : 2016-09-25                                                                        *
// Last Update : 2016-11-09                                                                        *
// Copyright   : (C) 2016 MSWaters                                                                 *
//**************************************************************************************************

//**************************************************************************************************
//                                                                                                 *
//      This program is free software; you can redistribute it and/or modify it under the          *
//      terms of the GNU General Public License as published by the Free Software Foundation;      *
//      either version 3 of the License, or (at your option) any later version.                    *
//                                                                                                 *
//**************************************************************************************************

#ifndef CONFIG_HPP
#define CONFIG_HPP

// Application Includes

#include "TypeDefs.hpp"
#include "CmdLinePcr.hpp"
#include "utility/PnlTxtSpn.hpp"
#include "utility/StrUtils.hpp"

// wxWidgets Includes

#include <wx/config.h>

// Local constant declarations

#define  CFG_DEF_TMPFILEMGT   eTFM_DELETE
#define  CFG_DEF_FRMLAYOUT    0
#define  CFG_DEF_PRECISION    CNVT_DEF_FLT_RES
#define  CFG_DEF_NBKMAXLNS    TXT_LNSDEF
#define  CFG_DEF_SPNPERIOD    SPN_PERIOD_DEF
#define  CFG_DEF_TOOLTIPS     false
#define  CFG_DEF_TOOLTIPDLY   700
#define  CFG_DEF_KEEPNETLST   false
#define  CFG_DEF_MAINPOSNX    100
#define  CFG_DEF_MAINPOSNY    100
#define  CFG_DEF_MAINSIZEW    793
#define  CFG_DEF_MAINSIZEH    623

#define  CFG_DEF_HELPPOSNX    500
#define  CFG_DEF_HELPPOSNY    1
#define  CFG_DEF_HELPSIZEW    500
#define  CFG_DEF_HELPSIZEH    700

#define  CFG_DEF_VERBOSEMODE  false
#define  CFG_DEF_GUILEPROC    wxT("spice-sdb")
#define  CFG_DEF_INCLUDEMODE  false
#define  CFG_DEF_EMBEDMODE    false
#define  CFG_DEF_NOMUNGEMODE  false

#define  CFG_DEF_SIMENG       wxT("NG-Spice")
#define  CFG_DEF_ANALYSIS     wxT("OP")
#define  CFG_DEF_PHASEUNITS   eUNITS_PHAD
#define  CFG_DEF_SYNCSWPSRCS  true
#define  CFG_DEF_SYNCTEMPS    true

#define  CFG_DEF_SCHEMEDIT    BIN_GSCHEM

#define  CFG_DEF_DATAVIEWER   wxT("Gaw")

//**************************************************************************************************

class Config
{
  private :

            wxFileName  m_oFileName;  // The RC file name
    static  wxConfig *  m_poCfg;      // Pointer to the wxWidgets configuration object

          bool         bSet( const wxString & rosGroup, const wxString & rosKey, int  iValue );
          bool         bSet( const wxString & rosGroup, const wxString & rosKey, bool bValue );
          bool         bSet( const wxString & rosGroup, const wxString & rosKey,
                             const wxString & rosValue );

          int          iGet( const wxString & rosGroup, const wxString & rosKey, int  iDefault );
          bool         bGet( const wxString & rosGroup, const wxString & rosKey, bool bDefault );
    const wxString & rosGet( const wxString & rosGroup, const wxString & rosKey,
                             const wxString & rosDefault );

  public :

          Config( void );
         ~Config( );

    bool  bOpen  ( const wxString & rosFileName=wxEmptyString );
    bool  bIsOpen( void ) { return( m_poCfg != NULL ); }
    bool  bClose ( void );
    bool  bFlush ( void );
    bool  bClean ( void );

          bool         bSetFileName( const wxString & rosFileName );
    const wxString & rosGetFileName( void );

    // Set configuration functions
    bool  bSetFrmLayout  ( uint             uiLayout       );  // MAIN       group
    bool  bSetTmpFileMgt ( eTypeTmpFileMgt  eTmpFileMgt    );
    bool  bSetPrecision  ( uint             uiFltRes       );
    bool  bSetNbkMaxLns  ( uint             uiLnCnt        );
    bool  bSetSpnPeriod  ( uint             ui_mSec        );
    bool  bSetToolTips   ( bool             bEnable        );
    bool  bSetToolTipDly ( uint             ui_mSec        );
    bool  bSetKeepNetLst ( bool             bEnable        );
    bool  bSetMainPosnX  ( int              iPosnX         );
    bool  bSetMainPosnY  ( int              iPosnY         );
    bool  bSetMainSizeW  ( int              iSizeW         );
    bool  bSetMainSizeH  ( int              iSizeH         );

    bool  bSetHelpPosnX  ( int              iPosnX         );  // HELP       group
    bool  bSetHelpPosnY  ( int              iPosnY         );
    bool  bSetHelpSizeW  ( int              iSizeW         );
    bool  bSetHelpSizeH  ( int              iSizeH         );

    bool  bSetNetLstFile ( const wxString      &  rosFile  );  // FILES      group
    bool  bSetSchemFiles ( const wxString      &  rosFiles );
    bool  bSetSchemFiles ( const wxArrayString & roasFiles );
    bool  bSetRecentFiles( const wxString      &  rosFiles );
    bool  bSetRecentFiles( const wxArrayString & roasFiles );
    bool  bSetDirLastAcc ( const wxString      &  rosDir   );

    bool  bSetVerboseMode( bool             bEnable        );  // GNETLIST   group
    bool  bSetGuileProc  ( const wxString & rosGuileProc   );
    bool  bSetIncludeMode( bool             bEnable        );
    bool  bSetEmbedMode  ( bool             bEnable        );
    bool  bSetNoMungeMode( bool             bEnable        );

    bool  bSetSimEng     ( const wxString & rosSimEng      );  // SIMULATOR  group
    bool  bSetSimEng     ( eTypeSimEng      eSimEng        );
    bool  bSetAnalysis   ( eTypeCmd         eAnalysis      );
    bool  bSetPhaseUnits ( eTypeUnits       eUnits         );
    bool  bSetSyncSwpSrcs( bool             bEnable        );
    bool  bSetSyncTemps  ( bool             bEnable        );

    bool  bSetSchemEdit  ( const wxString & rosSchemEdit   );  // SCHEMEDIT  group

    bool  bSetDataViewer ( const wxString & rosDataViewer  );  // DATAVIEWER group
    bool  bSetDataViewer ( eTypeViewer      eDataViewer    );

    // Get configuration functions
          uint              uiGetFrmLayout  ( void );
          eTypeTmpFileMgt    eGetTmpFileMgt ( void );
          uint              uiGetPrecision  ( void );
          uint              uiGetNbkMaxLns  ( void );
          uint              uiGetSpnPeriod  ( void );
          bool               bGetToolTips   ( void );
          uint              uiGetToolTipDly ( void );
          bool               bGetKeepNetLst ( void );
          int                iGetMainPosnX  ( void );
          int                iGetMainPosnY  ( void );
          int                iGetMainSizeW  ( void );
          int                iGetMainSizeH  ( void );

          int                iGetHelpPosnX  ( void );
          int                iGetHelpPosnY  ( void );
          int                iGetHelpSizeW  ( void );
          int                iGetHelpSizeH  ( void );

    const wxString      &  rosGetNetLstFile ( void );
    const wxString      &  rosGetSchemFiles ( void );
    const wxArrayString & roasGetSchemFiles ( void );
    const wxString      &  rosGetRecentFiles( void );
    const wxArrayString & roasGetRecentFiles( void );
    const wxString      &  rosGetDirLastAcc ( void );

          bool               bGetVerboseMode( void );
    const wxString      &  rosGetGuileProc  ( void );
          bool               bGetIncludeMode( void );
          bool               bGetEmbedMode  ( void );
          bool               bGetNoMungeMode( void );

    const wxString      &  rosGetSimEng     ( void );
          eTypeSimEng        eGetSimEng     ( void );
          eTypeCmd           eGetAnalysis   ( void );
          eTypeUnits         eGetPhaseUnits ( void );
          bool               bGetSyncSwpSrcs( void );
          bool               bGetSyncTemps  ( void );

    const wxString      &  rosGetSchemEdit  ( void );

    const wxString      &  rosGetDataViewer ( void );
          eTypeViewer        eGetDataViewer ( void );

    // The following function is intended for debugging
    void  Print( const wxString & rosPrefix=wxT("  ") );
};

//**************************************************************************************************

#endif // CONFIG_HPP
