/********************************* CMDI_Ident.cpp ********************************
 *                                                                                *
 *   #include "CMDI_Ident.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.                     *
 *                                                                                *
 **********************************************************************************/
#include <qvbox.h>
#include <qtabwidget.h>

#include "CMDI_Ident.h"
#include "CApp.h"
#include "drtux.h"
#include "../../MedinTuxTools/CHtmlTools.h"
#include "../../MedinTuxTools/CGenTools.h"
#include "../../MedinTuxTools/Codecs/qmdcodec.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//====================================== CMDI_Ident ============================================================================



//---------------------------------- CMDI_Ident --------------------------------------------------------------------------------
CMDI_Ident::CMDI_Ident( QWidget* parent, const char* name, int wflags,
			CMoteurBase *pCMoteurBase, RUBREC_LIST  *pRubList,
                        const char* num_GUID, const char* id_doss,
			const char* dossNom, const char* dossPrenom, const char* user)
   :CMDI_Generic( parent, name, wflags , pCMoteurBase, pRubList) // : QMainWindow( parent, name, wflags )
{   SetType(TYP_IDENTITE);
    SetPrintableState(TRUE);
    QVBox *pQVCentral = new QVBox( this );
    m_pFormRubIdent = new C_RubIdentite( pCMoteurBase, pRubList,
                                         num_GUID, id_doss,  dossNom,  dossPrenom,  user,
                                         pQVCentral, QString("Form")+name);
    if (m_pFormRubIdent)
       {      //..................... connecter impression ......................................................
         connect( m_pFormRubIdent->pushButtonPrint,      SIGNAL( clicked()),   this,    SLOT  ( OnPrint())  );
         connect( m_pFormRubIdent->pushButtonAdd,        SIGNAL( clicked()),   this,    SLOT  ( On_pushButtonAppend())  );

       }
    setIcon(Theme::getIcon("16x16/type_ident.png"));
    setFocusProxy( m_pFormRubIdent );
    setCentralWidget( pQVCentral );
}

//---------------------------------- ~CMDI_Ident -------------------------------------------------------------------------------
CMDI_Ident::~CMDI_Ident()
{emit Sign_RubIsDeleted(CMDI_Ident::S_GetRubName());
 if (G_pCApp->m_pDrTux) G_pCApp->m_pDrTux->m_pCMDI_Ident = 0;
}

//---------------------------------- ActiverRubrique -----------------------------------------------------------------------------
/*! \brief SLOT appelé pour activer la rubrique si mode = 0 on montre la rubrique telle quelle si 1 onglet administatratif (0), 2 onglet document(1). */
void CMDI_Ident::ActiverRubrique(const char *rubName, int mode)
{ if (rubName != m_RubName) return;
  switch (mode)
     {case 0: showNormal(); return;
      default: m_pFormRubIdent->tabWidget_Ident->setCurrentPage (mode-1); showNormal(); return;
     }
}

//---------------------------------- RubOnUserChange -----------------------------------------------------------------------------
/*! \brief SLOT appelé pour modifier l'utilisateur en cours de la fenêtre CMDI. */
void CMDI_Ident::RubOnUserChange(const char*user, const char*/*sign_user*/)
{ m_pFormRubIdent->m_User       = user;
}

//---------------------------------- OnIdentChange -----------------------------------------------------------------------------
/*! \brief Ce slot est appelé par qui veut, pour signaler un changement d'identité à cette fenetre MDI qui doit donc adapter son contenu à un nouveau malade.*/
void CMDI_Ident::OnIdentChange(const char* num_GUID,  const char* id_doss,
                               const char* dossNom ,  const char* dossPrenom )
{ m_pFormRubIdent->m_NumGUID    = num_GUID;
  m_pFormRubIdent->m_ID_Doss    = id_doss;
  m_pFormRubIdent->m_DossNom    = dossNom;
  m_pFormRubIdent->m_DossPrenom = dossPrenom;
  m_pFormRubIdent->SetData();
  m_pFormRubIdent->initData();
}

//---------------------------------- Slot_OnGlossaireFileClicked -----------------------------------------------------------------------------
/*! \brief SLOT qui répond au click d'un fichier du glossaire cela sert à mettre à jour le nom du masque par defaut 'm_pFormRubIdent->m_InsertMask'
 *  \param file :     fichier cliqué dans le glossaire
 *  \param typ_rub :  type de la rubrique concernée par ce répertoire du glossaire
*/
void CMDI_Ident::Slot_OnGlossaireFileClicked(const char *file , int typ_rub)
{if (typ_rub == CMDI_Ident::S_GetType()) m_pFormRubIdent->SetDefaultMaskFile(file);
}

//---------------------------------- GetCurrent_RubList_ID -----------------------------------------------------------------------------
/*! \brief fonction retournant l'indice (base 0 ) du document courant de la rubrique, dans la liste des documents. */
int     CMDI_Ident::GetCurrent_RubList_ID()
{return m_pFormRubIdent->Current_RubList_ID();   // noter rubrique affichée;
}

//---------------------------------- Current_RubList_Iterator -----------------------------------------------------------------------------
RUBREC_LIST::iterator CMDI_Ident::Current_RubList_Iterator()
{return m_pFormRubIdent->Current_RubList_Iterator();
}

//---------------------------------- OnPrint -----------------------------------------------------------------------------
/*! \brief SLOT appelé pour imprimer le contenu de la rubrique. */
void CMDI_Ident::OnPrint()
{m_pFormRubIdent->IfModified_SaveInRubList();
 emit Sign_Print();
}

//---------------------------------- SetInterfaceOnDroits ----------------------------------------------------------------------------------------
/*! \brief SLOT appelé par qui veut, pour adapter l'interface de la rubrique aux droits de l'utilisateur.
*/
void CMDI_Ident::SetInterfaceOnDroits(const QString &/*droits*/)
{m_pFormRubIdent->comboBox_RubName_activated( m_pFormRubIdent->comboBox_RubName->currentItem() );
}

//----------------------------- SetModifiableState -----------------------------------
/*! \brief SLOT qui définit la permission de modification des données. */
void CMDI_Ident::SetModifiableState(int state)
{if (m_pFormRubIdent )m_pFormRubIdent->SetModifiableState(state);
}

//----------------------------- SetCurentDocByPrimkey -----------------------------------
/*! \brief initialise l'affichage sur le document désigné par const QString &pk */
int  CMDI_Ident::SetCurentDocByPrimkey(const QString &pk)
{return m_pFormRubIdent->SetCurentDocByPrimkey(pk);
}


//----------------------------- ChangeCurrentComboBoxItemName -----------------------------------
/*! \brief SLOT qui change le nom de l'item courant de la comboBox */
void CMDI_Ident::ChangeCurrentComboBoxItemName(const QString &name)
{if (name.length()==0)               return;
 CPrtQListBoxItem* pCPrtQListBoxItem  = (CPrtQListBoxItem*) m_pFormRubIdent->comboBox_RubName->listBox()->item (  m_pFormRubIdent->comboBox_RubName->currentItem ()  );
 if (!pCPrtQListBoxItem)             return;
 pCPrtQListBoxItem->setText ( name );
}

//---------------------------------- GetRubListComboBox ----------------------------------------------------------------------------------
CPrtQListBoxItem    *CMDI_Ident::GetRubListComboBox()
{return (CPrtQListBoxItem*) m_pFormRubIdent->comboBox_RubName->listBox()->item (  m_pFormRubIdent->comboBox_RubName->currentItem () );
}

//----------------------------- GetCurrentEditor -----------------------------------
/*! \brief retourne l'éditeur de texte courant avancé type MyEditText */
MyEditText  *CMDI_Ident::GetCurrentEditor()
{return m_pFormRubIdent->m_pMyEditText;
}

//----------------------------- initData -----------------------------------
/*! \brief initialise la rubrique avec les données la concernant */
int  CMDI_Ident::initData()
{m_pFormRubIdent->m_LastRub    = -1;   // tres tres important
 m_pFormRubIdent->initData();
 return 0;
}

//---------------------------------- IfModified_SaveInRubList -----------------------------------------------------------------------------
/*! \brief sauvegarde le document en replaçant le contenu dans la liste des rubriques */
void CMDI_Ident::IfModified_SaveInRubList()
{m_pFormRubIdent->IfModified_SaveInRubList();
}
//---------------------------------- On_pushButtonAppend -----------------------------------------------------------------------------
/*! \brief fonction qui répond à l'appui du bouton de chargement d'une image */
void CMDI_Ident::On_pushButtonAppend()
{   if (m_pFormRubIdent->m_IsModifiable==0)         return;
    QString path = m_pFormRubIdent->GetDefaultMaskFile();              // recuperer dernier fichier cliqué du glossaire
    if ( path.length() ==0 )                        return;
    QString strData    = "";
    if ( QFile::exists( path ) ) CGestIni::Param_UpdateFromDisk(path, strData );
    if (strData.find("{{IMAGE_PICT}}") == -1)
       {int ret = QMessageBox::warning (0,  tr("Intégration d'une image"),
                                 tr("Le modèle d'intégration d'images par défaut : \r\n«") + QFileInfo(path).fileName() +
                                 tr("»\r\n ne permet pas le chargement d'image, (pas d'instruction de chargement d'image)\r\n"
                                    "Faut il Créer un nouveau document avec ce modèle comme texte seul ? ou charger tout de même une image."
                                   ),
                                 tr ("Annu&ler"), tr ("&Créer un nouveau document avec : "+QFileInfo(path).fileName()), tr ("Charger une &image"),
                                               1, 1 );
        if (ret == 0) return;
        if (ret == 2) {path    = G_pCApp->m_PathAppli + "Ressources/RubriquesTextes/ImageMaskSTD.html";
                       CGestIni::Param_UpdateFromDisk(path, strData);
                      }
        }
    AddNewDocument(strData, 0, path );
}

//---------------------------------- DoActionWithThisDocument -----------------------------------------------------------------------------
/*! \brief fait avec le document donné en entrée une action dépendante du verbe  */
void   CMDI_Ident::DoActionWithThisDocument(const QString &verbe, int /*typ*/, const char *path /* =0 */, const QDateTime */*pQDateTime =0 */, const QString */*libelle =0 */, const QString */*subType =0 */)
{if (m_pFormRubIdent->m_IsModifiable==0)                         return;
 if (! G_pCApp->IsThisDroitExist(G_pCApp->m_Droits, "doc"))      return;
 QString strData = "";
 CGestIni::Param_UpdateFromDisk(path, strData );
 if (strData.length()==0)                                        return;

 if (verbe == tr("Tout") || verbe == tr("Ajouter"))
    {//............... recuperer un iterateur sur le document affiché ................................
     RUBREC_LIST::iterator it = m_pFormRubIdent->Current_RubList_Iterator();
     //............... SI PAS DE  document affiché ...................................................
     if (it == m_pRubList->end())       // pas de document faut en créer un ?
        {if (QMessageBox::warning ( this, QString ( tr("MedinTux vous solicite") ),
                                               tr ( "Il n'existe pas de document valide pour cette action.<br>"
                                                    "Faut-il en créer un avec celui :<br><b>«")
                                                    + QFileInfo(path).fileName()+tr(" »</b><br>sélectionné dans le Glossaire "),
                                               tr ("Annu&ler"), tr ("&Créer"), 0,
                                               1, 1 )==1
            )
            {AddNewDocument(strData, 0, path);
            }
          return;
        }

     //.................. charger le document à traiter ...............................................
     QString strData = "";
     CGestIni::Param_UpdateFromDisk(path, strData );
     if (strData.length()==0)                         return;
     //.................. si presence d'un tag qui  indique de charger une image le faire ...........................
     //                   (cela ajoute les images à la liste d'images et cree le bloc html d'insertion de l'image)
     if (strData.find("{{IMAGE_PICT}}") != -1)
        {QString outParam, lastFile;
         CGestIni::Param_UpdateFromDisk(G_pCApp->m_PathDrTuxIni, outParam );
         CGestIni::Param_ReadParam( outParam, CMDI_Ident::S_GetRubName(),   "Path documents", &lastFile);
         QString   filename = G_pCApp->GetImageFileName(&lastFile);
         CGestIni::Param_WriteParam( &outParam, CMDI_Ident::S_GetRubName(), "Path documents", lastFile);
         CGestIni::Param_UpdateToDisk(G_pCApp->m_PathDrTuxIni, outParam);
         //............... crée la chaine html avec la référence à l'image, ajoute l'image à la liste d'images ...........................................
         strData = "";      // car makeData ajoute à ce qui est déjà existant
         if (filename.length() && QFile::exists( filename ))  m_pFormRubIdent->makeData(filename, 400, 500, strData, 0, path);   // ajoute les images à la liste et crée la structure html
         else                                                 return ;                                                                     // annuler ou fichier invalide
        }
     //.......................... faire les fusions si nécessaire .............................................
     G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Ident::S_GetRubName()+"_$FUSION_ADD_"+verbe);
     G_pCApp->m_pDrTux->FusionneDocument(strData, G_pCApp->m_User, it); // data = data.replace('0xa0','0x20');
     G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Ident::S_GetRubName()+"_$FUSION_END");
     if (verbe == tr("Tout")) m_pFormRubIdent->m_pMyEditText->selectAll();
     CHtmlTools::insertHtml(m_pFormRubIdent->m_pMyEditText, strData);
    }
}

//---------------------------------- AddNewDocument -----------------------------------------------------------------------------
/*! \brief replace le document en cours en replaçant le contenu dans la liste des rubriques, et ajoute un nouveau document à la liste */
CRubRecord*  CMDI_Ident::AddNewDocument(const QString &strData_in, int /*typ*/, const char *path /*=0*/, const QDateTime */*pQDateTime=0*/, const QString */*libelle=0*/, const QString */*subType=0*/, int  /*=0*/)
{
  if ( strData_in.length()==0 )                                   return 0;
  if (! G_pCApp->IsThisDroitExist(G_pCApp->m_Droits, "doc"))      return 0;
  //.................. replacer le document en cours dans la liste .......................................
  m_pFormRubIdent->IfModified_SaveInRubList();
  QString   filename     = path;
  QString   html_Data    = "";
  QString   image_Data   = "    <ImageListe>\r\n";
  //.................................. integrer le fichier image si besoin dans le document ..................................
  if    (strData_in.find("{{IMAGE_PICT}}") != -1)
        {QString outParam, lastFile;
         CGestIni::Param_UpdateFromDisk(G_pCApp->m_PathDrTuxIni, outParam );
         CGestIni::Param_ReadParam( outParam, CMDI_Ident::S_GetRubName(),   "Path documents", &lastFile);
         filename = G_pCApp->GetImageFileName(&lastFile);
         CGestIni::Param_WriteParam( &outParam, CMDI_Ident::S_GetRubName(), "Path documents", lastFile);
         CGestIni::Param_UpdateToDisk(G_pCApp->m_PathDrTuxIni, outParam);
         //............... crée la chaine html avec la référence à l'image, ajoute l'image à la liste d'images ...........................................
         if (filename.length() && QFile::exists( filename ))   m_pFormRubIdent->makeData(filename, 400, 500, html_Data, &image_Data, path);   // ajoute les images à la liste et crée la structure html
         else                                                  return 0;                                                                        // annuler ou fichier invalide
        }
  else
       { html_Data = strData_in;
       }
  image_Data           += "    </ImageListe>\r\n";

  //.................. Creer un nouveau document vide (les données seront replacées aprés fusion) dans la liste des rubriques .......................................
  QDateTime    qdt         =  QDateTime::currentDateTime();
  RUBREC_LIST::iterator it =  m_pRubList->append( CRubRecord(       G_pCApp->m_pCMoteurBase->GetPkDoc_Provisoire(m_pRubList),        // PrimKey d'un truc juste dans la liste et non encore en base (faudre sauver)
                                                                    QFileInfo(filename).baseName(),          // libelle
                                                                    QString::number(S_GetType()),            // type
                                                                    "Default SubType",                       // sous type
                                                                    qdt.toString ("yyyy-MM-ddThh:mm:ss"),    // date l'enregistrement
                                                                    G_pCApp->m_User,                         // utilisateur
                                                                    G_pCApp->m_SignUser                      // utilisateur signataire
                                                                    // strData,                                 // données texte
                                                                    // strData.length()                         // longueur des données
                                                            )
                                                 );

 //.......................... faire les fusions si nécessaire .............................................
 (*it).m_LastErr = "";
 G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Ident::S_GetRubName()+"_$FUSION_CREATE");
 G_pCApp->m_pDrTux->FusionneDocument(html_Data, G_pCApp->m_User, it); // data = data.replace('0xa0','0x20');
 G_pCApp->m_VAR_MAP.insert("$SCRIPT_STATUS",CMDI_Ident::S_GetRubName()+"_$FUSION_END");
 if ((*it).m_LastErr[0]=='_'||html_Data.find("__ERREUR Fusion :__") != -1)
    {m_pRubList->remove ( it );
     return 0;
    }
 else
    {//.................. activer l'interface .......................................
     m_pFormRubIdent->clearDocument();                    // effacer l'interface
     m_pFormRubIdent->m_pMyEditText->show();              // des fois que pas visible

     //.......................... on replace les données dans la liste apres fusion ..................................
     html_Data.prepend( "<?xml version=\"1.0\"  encoding=\"ISO-8859-1\" standalone=\"yes\" ?>\r\n"
                        "<MedinTux_Multimedia_data>\r\n"
                        "    <HTML_Data>\r\n"  );
     html_Data.append ( "    </HTML_Data>\r\n" );
     html_Data.append ( image_Data );
     html_Data.append ( "</MedinTux_Multimedia_data>\r\n" );
     m_pCMoteurBase->ReplaceDataInRubList(html_Data, it);
     //CGestIni::Param_UpdateToDisk("/home/ro/encodedData.txt", html_Data );
     //........................... reinitialiser l'interface .........................................................
     m_pFormRubIdent->pushButtonSave->show();
     m_pFormRubIdent->initData();
     return &(*it);
   }
}


