/********************************* CApp.h *****************************************

    Project: MedinTux
    Copyright (C) 2005 by Roland Sevin  and Data Medical Design
    E-Mail: data.medical.design@club-internet.fr

    This program is free software; you can redistribute it and/or modify
    it under the terms of the CeCILL Version 1 du 21/06/2004
    License (GPL compatible)
                               http://www.cecill.info/
    as published by :

    Commissariat � l'Energie Atomique
    - CEA,
                             31-33 rue de la F�d�ration, 75752 PARIS cedex 15.
                             FRANCE
    Centre National de la Recherche Scientifique
    - CNRS,
                             3 rue Michel-Ange, 75794 Paris cedex 16.
                             FRANCE
    Institut National de Recherche en Informatique et en Automatique
    - INRIA,
                             Domaine de Voluceau, Rocquencourt, BP 105, 78153
                             FRANCE

          This program is distributed in the hope that it will be useful,
          but WITHOUT ANY WARRANTY; without even the implied warranty of
          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
          CeCILL  License (GPL compatible) for more details.

*/

#ifndef C_APP_H
#define C_APP_H

#ifdef Q_WS_WIN
   #define F_EXE ".exe"
#else
   #define F_EXE ""
#endif


#include "../../drtux/src/CMoteur_Base.h"       // inclu aussi      #include "CRubList.h"
#include "../../MedinTuxTools/C_ImageList.h"    // Gestion des listes d'images
#include "../../MedinTuxTools/Theme.h"          // Gestion du thème de l'appli
#include "../../MedinTuxTools/CCoolPopup.h"     // Gestion des popups surgissants
#include "C_Atcd.h"

#ifdef COMMERCIAL_VERSION
    #include "../../Commercial/C_MUI_App.h"
    #include "../../Commercial/C_Cps.h"
    #include "../../Commercial/C_Vitale.h"
#else
    #include "../../MedinTuxTools/C_MUI_App.h"
#endif

#include <qobject.h>
#include <qmap.h>
#include <qiconset.h>

#define TR  QObject::tr
#define Min(a, b)             ((a) < (b) ? (a) : (b))
#define Max(a, b)             ((a) > (b) ? (a) : (b))

#define TYP_ORDO_CALC_CURENT    CMDI_Prescription::S_GetType()+999

#define WRITE_USER_PARAM   CGestIni::Param_WriteParam
#define READ_USER_PARAM    CGestIni::Param_ReadParam
#define READ_LOCAL_PARAM   CGestIni::Param_ReadParam
#define USER_PARAM         G_pCApp->m_UserDataParam
#define LOCAL_PARAM        G_pCApp->m_DrTuxParam
#define UPDATE_USER_PARAM G_pCApp->m_pCMoteurBase->Param_SavParam
//..................... Liste de paires type nom d'une variable (clef) et son contenu...................................................
typedef QMap<QString, QString> VAR_MAP;

//............................... exportation des variables globales Uniques de l'application ....................................
//
class DrTux;			// classe principale et parente de l'application
class CMoteurBase;		// classe d'outils de gestion des données en base de donnée
class CMedicaBase;		// classe d'outils de gestion des données en base de donnée therapeutique
class CMDI_ChoixPatient;	// classe de la fenetre de choix des patients
class CMDI_Ident;		// classe de la fenetre indentité du patient
class CMDI_Prescription;	// classe de la fenetre de gestion des prescriptions du patient
class CMDI_Observation;		// classe de la fenetre de gestion des observations du patient
class CMDI_Terrain;		// classe de la fenetre de gestion du terrain du patient
class CMDI_Documents;		// classe de la fenetre de gestion du terrain du patient
class CMDI_GroupedView;		// classe de la fenetre de gestion Multi-Vue
class CMDI_Generic;		// classe de la fenetre de gestion generique d'une rubrique

//================================================= CApp ==============================================================
class CApp : public C_MUI_App
{

   Q_OBJECT

 public:


     // Quelques enum pour les méthodes de trie
     /*! \brief Enumération pour les fonctions de tri des variables et des antécédents.
      *  Peut prendre les valeurs SortByDate, SortByValue, SortByRubrique, SortBySection, SortByLibelle
     */
     enum SortBy { SortByDate=0, SortByValue=1, SortByRubrique=2, SortBySection=3, SortByLibelle=4 };
     enum FIND_TYPE { IfExist=0, Always=1};

     CApp(QString mui_name, int & argc, char ** argv);
    ~CApp();


     void           saveLastUserOn_Ini(const QString &user, const QString &signUser, const QString &password, bool passwordMustBeRecorded  = 1 );
     int            AuthentifyAndSelectUser(QWidget * parent, const QString &newUser, const QString &newSignUser, bool passwordMustBeRecorded  = 1 );
     bool           IsAppStartWithUser();
     bool           IsThisDroitExist(const char *listDroits, const char *droitToFind);
     void           Map_Prefix_Droits();
     QString        GetMap_Prefix_Droits(const QString &doc_Type);
     int            SetIconTherapeutique();
     CMDI_Generic  *GetCurrentRubrique(QString *pRubName  = 0 , int* rub_type_ret  = 0 , CRubRecord **ppCRubRecord = 0 );
     void           putCurrentRubriqueOnModifiedState();
     int            PathDocumentToType( const QString &path , QString *pRubNameToFind = 0 );
     int            ApproximativeRubNameToType( const QString &texte , QString *pRubNameToFind=0);
     //--------------------------------------------- SetPathGlossaire --------------------------------------
     /*! \brief positionne le chemin du glossaire sur le path fourni en entree
     *  \param pathGlossaire : const QString chemin du glossaire à positionner
     *  \return Renvoie un chemin actif en absolu du glossaire
     */
     QString        SetPathGlossaire(QString pathGlossaire);

     //--------------------------------------------- ResolvPathGlossaire --------------------------------------
     /*! \brief retourne sous forme textuelle le type de rubrique associée au nom de rubrique fourni en entrée
     *  \param pathGlossaire : const QString chemin du glossaire tel que trouvé dans le fichier de parametrage
     *  \return Renvoie un chemin actif en absolu du glossaire
     */
     QString        ResolvPathGlossaire(QString pathGlossaire);
     //--------------------------------------------- RubNameToStringType --------------------------------------
     /*! \brief retourne sous forme textuelle le type de rubrique associée au nom de rubrique fourni en entrée
     *  \param rubName : const QString & nom de la rubrique dont on recherche le type
     *  \param f_typ : FIND_TYPE  SI  FIND_TYPE::Always alors le type est toujours retourné  SI FIND_TYPE::ifExist alors le type n'est retourné que si la rubrique est présente dans DrTux
     *  \return Renvoie le type de rubrique
     */
     QString          RubNameToStringType( const QString &rubName , FIND_TYPE f_typ = CApp::Always);

     /*! \brief retourne sous forme textuelle le type de rubrique associée au nom de rubrique fourni en entrée
     *  \param rubName : const QString & nom de la rubrique dont on recherche le type
     *  \param f_typ : FIND_TYPE  SI  FIND_TYPE::Always alors le type est toujours retourné  SI FIND_TYPE::ifExist alors le type n'est retourné que si la rubrique est présente dans DrTux
     *  \return Renvoie le type de rubrique
     */
     int              RubNameToType( const QString &rubName , FIND_TYPE f_typ = CApp::Always);
     //static int       S_RubNameToType( const QString &rubName);
     QString          TypeToRubName( int typRub );
     static QString   GetImageFileName(QString *last_path  = 0 , QString stringPreselect ="", int prewiew =1);
     QString          DoPopupList(QStringList &list);

     /*! \brief Affiche un popup amusant */
     void  CouCou(const QString &message, const QString &imagePath="", int tempo = 0);
     void  CouCou(const QString &message, const QColor &color, const QFont &ft , int tempo = 0, const QString &imagePath="");
public:


    DrTux                 *m_pDrTux;		/*!< Pointeur vers DrTux Objet principal */
    CMoteurBase           *m_pCMoteurBase;	/*!< Moteur de la base de données DrTux */
    CMedicaBase           *m_pCMedicaBase;	/*!< Moteur de la base de données médicamenteuse */
    QStringList            m_ListRubName;               /*!< Liste des rubriques disponibles */
    QMap<QString, int>     m_mapNameRubType;            /*!< liste des nom de rubrique avec leur type marche pas en static au linkage ==> G_mapNameRubType */

   //......................... contexte ......................................................
    QString              m_PathGlossaire;	/*!< Chemin vers le Glossaire */
    QString              m_PathAppli;		/*!< Chemin vers l'appli en cours */
    QString              m_PathTerrain;		/*!< Chemin vers le répertoire Terrain */
    QString              m_PathImages;		/*!< Chemin vers le répertoire de sauvegarde des images */
    QString              m_PathCfg_Base;	/*!< Chemin vers le fichier de configuration de la base */
    QString              m_PathTheme;		/*!< Chemin vers le Thème à utiliser */

    //.................... fichiers de configuration .........................................
    QString              m_PathDrTuxIni;	/*!< Chemin du fichier drtux.ini */
    QString              m_User;		/*!< Login de l'utilisateur en cours */
    QString              m_SignUser;		/*!< Login de l'utilisateur signataire */
    QString              m_UserDataParam;       /*!< parametres utilisateurs */
    QString              m_DrTuxParam;          /*!< variable de configuration locale du .ini */
    QString              m_CriptedPassWord;	/*!< Mot de passe crypté */
    QString              m_Droits;		/*!< Droits de l'utilisateur */
    QString              m_MessVisuDocNotPossible;	/*!< non documenté */
    QString              m_LastError;		/*!< variable de configuration locale du .ini */
    bool                 m_IsAppStartWithUser;	/*!< Appli démarrée avec un utilisateur oui/non */
    int                  m_TimerVerrouDelay;	/*!< Temps de verrouillage */

    //.................... Configuration Pour le Terrain ...........................
    // Trie
    int			 m_Atcd_SortBy;	/*!< Utilisé par la classe Atcd_Code pour méthode de trie. \sa enum SortBy */
    int			 m_Var_SortBy;	/*!< Utilisé par la classe Var_Code pour méthode de trie. \sa enum SortBy */
    int			 m_VarValue_SortBy;	/*!< Utilisé par la classe Var_Code pour méthode de trie. \sa enum SortBy */
    // Objets du terrain
    Atcd_Code*		 m_pAtcd_Code;	/*!< Objet de gestion du terrain pour les antécédents */


    //................. Theme .................................
    Theme		m_Theme;		/*!< Pointeur vers le thème (icones, choix des couleurs et fontes) */
    QIconSet		m_IconTherapeutique;	/*!< Icone pour la thérapeutique selon la base médicaments */

    //.................. prefixage des types de documents prescriptifs avec le type de droit .......................
    //                                key               value
    //  #define TYP_ORDO_CALC      20020100              or
    //  #define TYP_ORDONNANCE     20020200              ot
    //  #define TYP_CERTIFICAT     20020300              ce
    //  #define TYP_COURRIER       20020500              co

    QMap<QString, QString> m_mapDroitPrefix;            /*!< Non documentée */
    C_ImageList            m_C_ImageList;	        /*!< Pour la gestion des documents (CMDI_Documents) */
    VAR_MAP                m_VAR_MAP;                   /*!< Pour la gestion des variables de script */
    CCoolPopup            *m_pCCoolPopup;              /*!< Pour afficher un message en popup surgissant en bas à droite */
    int                    m_CCoolPopupTempo;          /*!< temps de persistance du menu à l'écran en microsecondes */
//......................... carte PS .............................
#ifdef COMMERCIAL_VERSION
  C_Cps  *m_pCps;
#endif

public slots:
     void  CouCouUp(   CCoolPopup * pCCoolPopup);
     void  CouCouStop( CCoolPopup * pCCoolPopup);
     void  CouCouDestroy();
};

extern CApp* G_pCApp;				           /*!< Instance globale de l'application */
//static QMap<QString, int>     G_mapNameRubType;            /*!< liste des nom de rubrique avec leur type car static refusée dans le corps de la classe au linkage */
#endif

