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

#include "CApp.h"
#include "drtux.h"

#include <qfiledialog.h> 
#include <qpixmap.h>
#include <qimage.h> 
#include <qlabel.h>
#include <qtextedit.h>
#include <qcstring.h> 
#include <qbuffer.h>
#include <qmessagebox.h>
#include "../../MedinTuxTools/CHtmlTools.h"
#include "../../MedinTuxTools/CGenTools.h"
#include "../../MedinTuxTools/Codecs/qmdcodec.h"
#include "CPreview.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//====================================== CMDI_Documents ============================================================================

//---------------------------------- CMDI_Documents --------------------------------------------------------------------------------
CMDI_Documents::CMDI_Documents( 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)
{ SetType(TYP_DOCUMENTS);
  SetPrintableState(TRUE);
  // QVBox *pQVCentral = new QVBox( this );
  // pQVCentral->setMargin( 0 );
  // pQVCentral->setSpacing(0);
  // pQVCentral->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
  m_pC_RubDocuments = new C_RubDocuments(pCMoteurBase, pRubList,
                                         num_GUID, id_doss,  dossNom,  dossPrenom,  user,
                                         this, QString("Form")+name );
  if (m_pC_RubDocuments)
     {
      //..................... connecter impression ......................................................
      connect( m_pC_RubDocuments->pushButtonPrint,      SIGNAL( clicked()),   this,    SLOT  ( OnPrint())  );
      connect( m_pC_RubDocuments->pushButtonAdd,        SIGNAL( clicked()),   this,    SLOT  ( On_pushButtonAppend())  );


    }
  setIcon ( Theme::getIconListTypeDocument().pixmap(QIconSet::Automatic,TRUE,QIconSet::On) );
  setCentralWidget( m_pC_RubDocuments );
}

//---------------------------------- ~CMDI_Documents -------------------------------------------------------------------------------
/*! \brief destructeur. */
CMDI_Documents::~CMDI_Documents()
{emit Sign_RubIsDeleted(CMDI_Documents::S_GetRubName());
 if (G_pCApp->m_pDrTux) G_pCApp->m_pDrTux->m_pCMDI_Documents = 0;
}

//---------------------------------- 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_pC_RubDocuments->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_Documents::Slot_OnGlossaireFileClicked(const char *file , int typ_rub)
{if (typ_rub == CMDI_Documents::S_GetType()) m_pC_RubDocuments->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_Documents::GetCurrent_RubList_ID()
{return m_pC_RubDocuments->Current_RubList_ID();   // noter rubrique affichée;
}

//---------------------------------- Current_RubList_Iterator -----------------------------------------------------------------------------
RUBREC_LIST::iterator CMDI_Documents::Current_RubList_Iterator()
{return m_pC_RubDocuments->Current_RubList_Iterator();
}

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

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

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

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

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

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


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

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

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

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

//---------------------------------- IfModified_SaveInRubList -----------------------------------------------------------------------------
/*! \brief sauvegarde le document en replaçant le contenu dans la liste des rubriques */
void CMDI_Documents::IfModified_SaveInRubList()
{m_pC_RubDocuments->IfModified_SaveInRubList();
}
//---------------------------------- On_pushButtonAppend -----------------------------------------------------------------------------
/*! \brief fonction qui répond à l'appui du bouton de chargement d'une image */
void CMDI_Documents::On_pushButtonAppend()
{   if (m_pC_RubDocuments->m_IsModifiable==0)       return;
    QString path = m_pC_RubDocuments->GetDefaultMaskFile();              // recuperer dernier fichier cliqué du glossaire
    if ( path.length() ==0 )                        return;
    QString strData = "";
    if ( QFile::exists( path ) )
       {CMoteurBase::Param_UpdateFromDisk(path, strData );
       }
    else
       {strData = "<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body style=\"font-size:10pt;font-family:Sans\">"
                  "<p><hr><span style=\"font-weight:600\">Nom de l'image :</span> {{IMAGE_NAME}} {{:: sous_type ( Test de sous type ) }}<br />"
                  "<span style=\"font-weight:600\">Ici l'image : </span>{{IMAGE_PICT}}{{IMAGE_MAX_WIDTH=600}}<hr></p>"
                  "</body></html>";
       }
    if (strData.find("{{IMAGE_PICT}}") == -1   &&
       QMessageBox::warning (0,  tr("Intégration d'une image"),
                                 tr("Ce modèle : \r\n«") + QFileInfo(path).fileName() + 
                                 tr("»\r\n ne permet pas le chargement d'image, (pas d'instruction de chargement)\r\n"
                                    "Faut il Créer un nouveau document avec ce modèle comme texte seul ?."
                                   ),
                                 tr ("Annu&ler"), tr ("&Créer un nouveau document avec : "+QFileInfo(path).fileName()), 0,
                                               1, 1 )==0
        )
       {
        return;
       }
    AddNewDocument(strData, 0, path );
}

//---------------------------------- DoActionWithThisDocument -----------------------------------------------------------------------------
/*! \brief fait avec le document donné en entrée une action dépendante du verbe  */
void   CMDI_Documents::DoActionWithThisDocument(const QString &verbe, int /*typ*/, const char *path /* =0 */, const QDateTime */*pQDateTime =0 */, const QString */*libelle =0 */, const QString */*subType =0 */)
{if (m_pC_RubDocuments->m_IsModifiable==0)                       return;
 if (! G_pCApp->IsThisDroitExist(G_pCApp->m_Droits, "doc"))      return;
 QString strData = "";
 CMoteurBase::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_pC_RubDocuments->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 = "";
     CMoteurBase::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;
         CMoteurBase::Param_UpdateFromDisk(G_pCApp->m_PathDrTuxIni, outParam );
         CMoteurBase::Param_ReadParam( outParam, CMDI_Documents::S_GetRubName(),   "Path documents", &lastFile);
         QString   filename = G_pCApp->GetImageFileName(&lastFile);
         CMoteurBase::Param_WriteParam( &outParam, CMDI_Documents::S_GetRubName(), "Path documents", lastFile);
         CMoteurBase::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_pC_RubDocuments->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_pDrTux->FusionneDocument(strData, G_pCApp->m_User, it); // data = data.replace('0xa0','0x20');
     if (verbe == tr("Tout")) m_pC_RubDocuments->m_pMyEditText->selectAll();
     CHtmlTools::insertHtml(m_pC_RubDocuments->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 */
void CMDI_Documents::AddNewDocument(const QString &strData_in, int /*typ*/, const char *path /*=0*/, const QDateTime */*pQDateTime=0*/, const QString */*libelle=0*/, const QString */*subType=0*/)
{
  if ( strData_in.length()==0 )                                   return;
  if (! G_pCApp->IsThisDroitExist(G_pCApp->m_Droits, "doc"))      return;
  //.................. replacer le document en cours dans la liste .......................................
  m_pC_RubDocuments->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;
         CMoteurBase::Param_UpdateFromDisk(G_pCApp->m_PathDrTuxIni, outParam );
         CMoteurBase::Param_ReadParam( outParam, CMDI_Documents::S_GetRubName(),   "Path documents", &lastFile);
         filename = G_pCApp->GetImageFileName(&lastFile);
         CMoteurBase::Param_WriteParam( &outParam, CMDI_Documents::S_GetRubName(), "Path documents", lastFile);
         CMoteurBase::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_pC_RubDocuments->makeData(filename, 400, 500, html_Data, &image_Data, path);   // ajoute les images à la liste et crée la structure html
         else                                                  return ;                                                                        // annuler ou fichier invalide
        }
  else
       { html_Data = strData_in;
       }
  image_Data           += "    </ImageListe>\r\n";
  //.................. activer l'interface .......................................
  m_pC_RubDocuments->clearDocument();                    // effacer l'interface
  m_pC_RubDocuments->m_pMyEditText->show();              // des fois que pas visible

  //.................. 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(       "0",                                     // 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 .............................................
 G_pCApp->m_pDrTux->FusionneDocument(html_Data, G_pCApp->m_User, it); // data = data.replace('0xa0','0x20');
 //.......................... 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_pC_RubDocuments->pushButtonSave->show();
 m_pC_RubDocuments->initData();
}


