//
// C++ Interface: C_Atcd
//
// Description: 
//
//
// Author: Eric MAEKER eric.maeker@free.fr, (C) 2008
//
// Copyright: See COPYING file that comes with this distribution
//
//

#ifndef ATCD_CODE_H
#define ATCD_CODE_H

#include <qstring.h>
#include <qstringlist.h>
#include <qdatetime.h>
#include <qvaluelist.h>
#include <qobject.h>
#include <qwidget.h>

#include <qlistview.h>
#include "CMoteur_Base.h"
#include "../../MedinTuxTools/CPrtQListViewItem.h"
#include "../../MedinTuxTools/CGenTools.h"
#include "../../MedinTuxTools/Theme.h"

#include "DlgAtcd_txt.h"
#include "DlgAllergie.h"
#include "../../MedinTuxTools/Calendar/Dlg_Calendar.h"
#define  TR        QObject::tr

//class QObject;

/**
        @author Eric MAEKER <eric.maeker@free.fr>
*/

/*! \class Atcd_Element
 *  \brief Classe Atcd et C_Atcd : Deux classes qui gèrent les ATCD pour toute l'application. Il suffit d'injecter le fichier de Terrain et le reste suit.
 *  Cette classe contient les items de chaque ATCD :
 *  - libellé
 *  - date
 *  - code CIM10
 *  - rubrique
 *  - commentaire
 *  - état
 */

class Atcd_Element
{
public :
        Atcd_Element()
                { m_Rubrique=""; m_Libelle=""; m_Code=""; m_Etat=0; m_Commentaire=""; m_Id_ATCD = -1;}

        Atcd_Element(const char*  rubrique, 
                     const char*  libelle, 
                     QDate&       dt,
                     const char*  code,
                     int          etat,
                     const char*  commentaire)
                { m_Rubrique    = rubrique; 
                  m_Libelle     = libelle;
                  m_Code        = code;
                  m_Etat        = etat;
                  m_Date        = dt;
                  m_Commentaire = commentaire;
                  m_Id_ATCD     = -1;
                }

        ~Atcd_Element() {}


        // Implémentation de l'opérateur inférieur pour accéder aux fonction qHeapSort
        // Trie selon le nom de la rubrique
        bool operator< (const Atcd_Element& e) const ;
        bool operator== (const Atcd_Element& e) const ;

        bool                 isAllergie();
        bool                 isCIM10();
        bool                 isVidal();
        QString              getLightCIM10();
        QPixmap              getPixmap();
        void                 setId            (int n)        { m_Id_ATCD = n ; }
        int                  getId()                         { return m_Id_ATCD; }

public:
        QString              m_Libelle;             /*!< libellé de l'ATCD */ 
        QString              m_Rubrique;            /*!< Rubrique de l'ATCD */
        QDate                m_Date;                /*!< Date de l'ATCD */
        QString              m_Code;                /*!< codage CIM10, allergie */
        QString              m_Commentaire;         /*!< Commentaire de l'ATCD */
        int                  m_Etat;                /*!< Passé(0) ou Actif(1) */
        int                  m_Id_ATCD;             /*!< Id de l'ATCD défini lors de la lecture du terrain, non modifié par la suite */


};
// Définition d'un alias vers une liste d'antécédents
typedef QValueList<Atcd_Element> ATCD_LISTE;



class Atcd_Code : public QObject
{
  Q_OBJECT

public:
    Atcd_Code(QWidget *parent=0, const char *name=0);
    ~Atcd_Code();

        ////////////////////////////////////////////
        ///////////////  METHODES  /////////////////
        ////////////////////////////////////////////

        void                init_Get_RubChir(QStringList *pListItem  = 0 );
        void                init_Get_RubMed(QStringList *pListItem   = 0 );

        bool                isModified();
        void                setModifiedState( bool state );

        // RECUPERATION DU TERRAIN
        void                setTerrain(CRubRecord* pCRubRecord, CMoteurBase* pCMoteurBase);
        int                 setTerrain  (RUBREC_LIST::iterator it, CMoteurBase* pCMoteurBase);

        // RECUPERATION DES ELEMENTS
        void                 getAtcdToListViewItem                (CPrtQListViewItem& retour);
        void                 getAtcdToSimpleListView              (QListView& retour);
        QString              get_ATCD_Rubname                     (Atcd_Element& pAtcd);
        bool                 getIdRubrique(Atcd_Element& pAtcd, bool& isMed, bool& isChir, bool& isAllergie, int& id, QString  *pRubname  = 0 );
        QString              getRubriqueName_Medical              (int id);
        QString              getRubriqueName_Chirurgical          (int id);
        QDate                getDDR                               ();
        QString              getTermeObstetrical                  (QDate dt = QDate());
        Atcd_Element*        getAtcd_byID                         (int idAtcd);
        QString              getPkDocTerrain                      ();

        // FONCTIONS DE TRI
        void                 setSort(int mode);
        void                 sort();

        // AJOUTS / MODIFICATIONS
        void                viewATCD                  (int id_ATCD);
        void                modifyDate                (Atcd_Element* pAtcd);
        void                changeEtat                (Atcd_Element* pAtcd);
        void                changeCommentaire         (Atcd_Element* pAtcd);
        void                eraseAtcd                 (Atcd_Element* pAtcd);
        void                modifyAtcd                (Atcd_Element* pAtcd);
        void                setRubrique               (Atcd_Element* pAtcd, QString& rubrique);
        void                setGrossesse              (bool etat);
        void                setAllaitement            (bool etat);
        void                setDDRTo                  (QDate dt);
        void                clear                     ();


        // GESTION DE LA SAUVEGARDE
        QString             toOldIni();


        ////////////////////////////////////////////
        ///////////////   SLOTS    /////////////////
        ////////////////////////////////////////////

public slots:
        // AJOUTS / MODIFICATIONS
        void                emitATCD_Changed        ();
        void                addATCD_CIM10           ();
        void                addATCD_Textuel         ();
        void                addATCD_Allergie        ();
        void                changeDDR               ();



        ////////////////////////////////////////////
        ///////////////   SIGNALS  /////////////////
        ////////////////////////////////////////////

signals:
        void                ATCD_Changed();                /*!< \brief Signal émit à chaque modification des Antécédents. Attention ne modifie pas la propriété m_TerrainIsModified avant. Pour cela il faut appeler le Slot emitATCD_Changed(). */

private:
        void                setTerrain(const char* strTerrain, CMoteurBase* pCMoteurBase);


        ////////////////////////////////////////////
        ///////////////   DONNEES  /////////////////
        ////////////////////////////////////////////

public :

        QStringList        m_Rubriques_ATCD_Med;         /*!< contient la liste des rubriques disponibles. */
        QStringList        m_Rubriques_ATCD_Chir;        /*!< contient la liste des rubriques disponibles. */
        QString            m_Terrain;                    /*!< Le fichier terrain à analyser */
        ATCD_LISTE         m_Atcd_Liste;                 /*!< Liste des ATCD */
        bool               m_Grossesse;                  /*!< Contient TRUE si grossesse en cours. */
        QDate              m_DDR;                        /*!< Date des dernieres règles. */
        bool               m_Allaitement;                /*!< Contient TRUE si allaitement en cours. */
        QString            m_PkDocTerrain;               /*!< Contient le PkDoc du Terrain en cours, utile pour tester la synchronisation des terrains */
        bool               m_TerrainIsModified;          /*!< Se modifie en cas de modification des antécédents */

};

#endif
