
/*********************************** CDevilCrucible.h *****************************
 *                                                                                *
 *   #include "CDevilCrucible.h"                                                  *
 *   Project: MedinTux                                                            *
 *   Copyright (C) 2003 2004 2005 by Sevin Roland  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  CDEVILCRUCIBLE_H
#define  CDEVILCRUCIBLE_H


#include <qstring.h>
#include <qmap.h>

#include <stdlib.h>
#include <qobject.h>
#include <math.h>
#include <qdatetime.h>
#include <qmemarray.h>
#include <qpixmap.h>
#include <qpainter.h>

#include "CDevilFormPDF.h"
#include "CDevilGraph.h"
#include "CDevilCalc.h"
#include "CRubList.h"
#include "CMoteur_Base.h"
#include "../../MedinTuxTools/CMedicaBase.h"
#include "Rubriques.h"

//..................... Liste de paires type de document-Index dans RUBREC_LIST.........................................................
//                      sert par exemple à établir un liste de documents en cours
//                      d'affichage avec leur index dans liste des rubrique



//====================================== DOCUMENT_DISPLAY_MAP =======================================================
// cette QMap permet d'associer un pointeur sur un contenu de rubrique : *CRubRecord   �
// une clef : QString qui contient le nom : 'Observation' , 'Prescription',  'Terrain'  etc ...
// de la rubrique en cours dans laquelle est affich� : CRubRecord

typedef QMap<QString, CRubRecord*> DOCUMENT_DISPLAY_MAP;

//====================================== CDevilCrucible ==============================================================




class CDevilCrucible
{
public:

     CDevilCrucible(QString                *pDocument     ,       // texte du document �fusionner
                    CMoteurBase            *pCMoteurBase  ,       // moteur de base de donn�s
                    CMedicaBase            *pCMedicaBase  ,       // moteur de base de donn�s medicamenteuses
                    RUBREC_LIST            *pRubList      ,       // liste des documents composant le dossier patient
                    QString                &identPrimKey  ,       // il faut les renseignements sur le patient
                    DOCUMENT_DISPLAY_MAP  *pCurrentRubIdMap,      // liste des rubriques courantes (affich�s)
                    QString                &userActuelPk  ,       // utilisateur courant du programme
                    CRubRecord            *pCRubCurrentRecord = 0 // pointeur sur l'enregistrement rubrique en cours (si il y en a un)
                   );

     ~CDevilCrucible();

// ****************************************************************************************************** //
// *                                    FONCTIONS GENERALES D'INTERPRETATION                            * //
// ****************************************************************************************************** //
     void               DoMixture                     ();
     int                DoMixture                     (int pos_deb, int pos_max);

     int                ReplaceTokenByValue           (QString &document,int pos_deb, int len,  int *pDeltaLen =0);
     QString            GetResolvTokenValue           (QString &document,int pos_deb, int len);
     CRubRecord*        GetIDCurrentDoc               (const QString &doc_name);
     int                GetIDCurrentFamilyDoc         (QString doc_type, int part = 4);
     QString            GetDateOfActiveRubrique ();
     QString            DocNameToDocNumType           (const QString &doc_name, int part  = 8 );

     long               findLastDelimiter             (QString &str, char delimiter);
     int                ResolvTokenSyntax             (QString &resolvToken, QString &token);
     char*              HtmlFind                      (const char* pt_in, QString motif, char **debMotif =0);
     char*              IfHtmlTagJumpIt               (char* pt);
     QString            IdentValidCarToFieldName      (int c);

     QString            NormaliseDate           (const QString &date);



// ****************************************************************************************************** //
// *                                    EXECUTION DU SCRIPT                                             * //
// ****************************************************************************************************** //
     int                ResolvScriptTokenSyntax       (QString &resolvToken, QString token);

     QString            exeFunction                   (QString function, QString arg_str );
     long               extractArgList                (QStringList &arg_list, QString arg_str);
     void               DoFusionIntervenantStruct     (const char *primKeyPat ,
                                                       const QString &specialite,
                                                       QString validStr,
                                                       QString &prefix_ID,
                                                       const QString &style,
                                                       const QString &decalage,
                                                       QString &text);
    QString          & RelPathToAbsPath(QString &path);

    void               exeItemsFrom_A_To_D  (QString &resolvToken, QString token, QString &document);
    void               exeItemsFrom_E_To_H  (QString &resolvToken, QString token, QString &document);
    void               exeItemsFrom_I_To_L  (QString &resolvToken, QString token, QString &document);
    void               exeItemsFrom_M_To_P  (QString &resolvToken, QString token, QString &document);
    void               exeItemsFrom_Q_To_T  (QString &resolvToken, QString token, QString &document);
    void               exeItemsFrom_U_To_X  (QString &resolvToken, QString token, QString &document);
    void               exeItemsFrom_Y_To_Z  (QString &resolvToken, QString token, QString &document);

    QString            exeFunctionsFrom_A_To_D  (QString &func, QString &args);
    QString            exeFunctionsFrom_E_To_H  (QString &func, QString &args);
    QString            exeFunctionsFrom_I_To_L  (QString &func, QString &args);
    QString            exeFunctionsFrom_M_To_P  (QString &func, QString &args);
    QString            exeFunctionsFrom_Q_To_T  (QString &func, QString &args);
    QString            exeFunctionsFrom_U_To_X  (QString &func, QString &args);
    QString            exeFunctionsFrom_Y_To_Z  (QString &func, QString &args);

// ****************************************************************************************************** //
// *                                    FONCTIONS DE CALCUL ET CALENDRIERS                              * //
// ****************************************************************************************************** //
     QString            GetDDR                  ();
     QString            Terme_Obst              (QDate DDR , QDate dt);
     QString            Terme_Obst              (QString DDR , QDate dt);
     void               GetPoidsTaille          (const char* pt_doc, QString &tableau, QString &poids_name,
                                                 QString &taille_name, QString &poids_var, QString &taille_var);

     QStringList        GetVar                  (QString &section_var, QString &name_var);

     QString            GetVarNeerer            (QStringList &values, QString &dateSel);

     QString            GetVarNeerer            (QString &section, QString &variable, QString &dateSel);

     QString            daysTo                  (const QString &date1, const QString &date2);

// ****************************************************************************************************** //
// *                                    FONCTIONS D'EXTRACTION                                          * //
// ****************************************************************************************************** //

     QString            Func_Extract_TTT        (const QString &title, QString &linePatern,
                                                 QString renouvInterc, QString &tableau,
                                                 QString &poids_name, QString &taille_name);

     QString            Func_Extract            (QString &doc_type, QString &tag_deb, QString &tag_end,
                                                 QString &find_to, QString &replace_by);

     QString            Func_Extract_VAR        (QString &section_VAR, QString &name_VAR,
                                                 QString &date_deb, QString &date_end,QString &date_intervalle);

     QString            Func_Extract_Table      (QString &section_VAR, QString &list_VAR, QString &date_deb,
                                                 QString &date_end, QString &cell_W , QString &cell_H,
                                                 QString &border_W, QString &width, QString &dateTimeFormat,
                                                 QString &dateTimeWidth);

     QString            Func_Extract_ATCD       (const QString &medPrefix,    const QString &chirPrefix,
                                                 const QString &allergPrefix, const QString &diversPrefix,
                                                 const QString &linePatern,   const QString &datePrefix);

    CMoteurBase*	GetMB			() { return m_pMB; }
    QString		GetMIdentPrimKey	() { return m_IdentPrimKey; }
    QString		GetUserDocPk		() { return m_UserDocPk; }



protected:
     DOCUMENT_DISPLAY_MAP   *m_pCurDisplayDocMap; /*!< pointer to DOCUMENT_DISPLAY_MAP, current displaying documents list */
     RUBREC_LIST            *m_pRubList;          /*!< pointer to RUBREC_LIST documents list of the patient */
     CMoteurBase            *m_pMB;               /*!< pointer to CMoteurBase class to provide database functions manipulation's */
     CMedicaBase            *m_pMD;               /*!< pointer to CMedicaBase class to provide drugs database functions manipulation's */
     QString                 m_IdentPrimKey;      /*!< patient identity primary key on m_DOSS_IDENT_TBL_NAME */
     QString                *m_pDocument;         /*!< QString pointer to the text to be modified */
     QString                 m_UserActuelPk;      /*!< current  user primary key on m_USER_IDENT_TBL_NAME from actual   user */
     QString                 m_UserDocPk;         /*!< current  user primary key on m_USER_IDENT_TBL_NAME from document user */
     CRubRecord             *m_pCRubCurrentRecord;/*!< current  rubrique record  (if exist) */
     QString                 m_PluginRun;         /*!< current  running plugin   (if exist) */

     typedef  void (CDevilCrucible::*PrtItemScript)(QString&, QString, QString&);
     PrtItemScript ItemDispatcher [7];            /*!< tableau de pointeurs de fonctions pour dispatcher les items de scripts vers les fonctions exeItemsFrom_A_To_D et la suite. */

     typedef  QString (CDevilCrucible::*PrtFunctionScript)(QString&, QString&);
     PrtFunctionScript FunctionDispatcher [7];    /*!< tableau de pointeurs de fonctions pour dispatcher les items de scripts vers les fonctions exeItemsFrom_A_To_D et la suite. */

};


#endif
