#include <QtGui>
#include <QtCore>
#include <QtSql>
#include <QtDebug>
#include "apidialog.h"
#include "textdialog.h"
#include "configdialog.h"

extern QString g_pathabsolu;

int version = 0;
//////////////constructeur///////////////////////////////////:
apidialog::apidialog(){
  setupUi(this);
  setAttribute(Qt::WA_DeleteOnClose);
  m_compteur = 0;
  m_namesIntegrated = "";
  //liste lignes d'entêtes
  /*comboBox_2->setEditable(true);
  comboBox_2->setInsertPolicy(QComboBox::InsertAtTop);*/
  QDir versionDir(qApp->applicationDirPath()+"/version");
  QStringList filesOfVersionDir;
  filesOfVersionDir = versionDir.entryList(QDir::Files);
  QString versionFile;
  if (filesOfVersionDir.size()>0)
  {
  	versionFile = filesOfVersionDir[0];
      }
  version = versionFile.toInt();
  codecLabel->setText("codec");
  enum HtmlCodes{NUMBERZERO = 0,NUMBER_ONE,CODE,HTML_NUMBER,CHAR,HTML_NUMERIC_CODE,HTML_CHAR_CODE,EXPLANATION};
  QFile htmlFile(qApp->applicationDirPath()+"/html");
  if (!htmlFile.open(QIODevice::ReadOnly))
  {
  	  qWarning() << __FILE__ << QString::number(__LINE__) << "unable to open htmlFile" ;
      }
  QTextStream streamHtml(&htmlFile);
  while (!streamHtml.atEnd())
  {
  	QString line = streamHtml.readLine();
  	if (line.contains("&#"))
  	{
  		QStringList listLine = line.split("_")  ;
  		qDebug() << __FILE__ << QString::number(__LINE__) << " line =" << listLine.join(",") ;
  		m_hashHtml.insert(listLine[CHAR],listLine[HTML_NUMERIC_CODE]);
  		
  	    }
  	
      }
  QFile titresini(g_pathabsolu+"/titres.ini");
  if(!titresini.open(QIODevice::ReadWrite|QIODevice::Text))
		{
      QMessageBox::warning(0,tr("erreur"),trUtf8("erreur ouverture fichier titres.ini !"),QMessageBox::Ok);
		}
  QTextStream streamtitres(&titresini);
  while(!streamtitres.atEnd()){
      QString lignetitre = streamtitres.readLine();
      m_titres << ""+lignetitre+"";
				}
  //comboBox_2->addItems(m_titres);
  comboBox->setEditable(1);
  comboBox->setInsertPolicy(QComboBox::NoInsert);
  qDebug() << __FILE__ << " " << QString::number(__LINE__);
  //choix user preferentiel et liste d'utilisateurs
  QStringList listepoint;
  QFile user(g_pathabsolu+"/utilisateur.ini");
  if(!user.open(QIODevice::ReadOnly))
	{
      QMessageBox::warning(0,tr("erreur"),trUtf8("erreur ouverture fichier utilisateur.ini !"),QMessageBox::Ok);
	}
  QTextStream point(&user);
  while(!point.atEnd()){
      QString lignepoint = point.readLine();
      listepoint << lignepoint;
  }
  QString utilisateurphrase = listepoint[3];
  utilisateurphrase.replace(" ","");
  QStringList utilliste = utilisateurphrase.split("=");
  QString utilisateur = utilliste[0];
  //choix user
  m_listelogin << utilisateur;
  qDebug() << __FILE__ << " " << QString::number(__LINE__);
  QSqlQuery query;
  query.exec("SELECT Login FROM Personnes");
  qDebug() << __FILE__ << " " << QString::number(__LINE__);
  while(query.next()){
      m_login = query.value(0).toString();
      m_listelogin << ""+m_login+"";
  }
  comboBox->addItems(m_listelogin);
  QDir dir(g_pathabsolu+"/apitemp");
  QStringList filters;
  filters << "*.txt" << "*.rtf" << "*.doc" << "*.hpr" << "*.odt" << "*.abw";
  dir.setNameFilters(filters);
  int numberOfFilesToIntegrate = dir.entryList().size();
  QString labelText = trUtf8("Il y a ")+QString::number(numberOfFilesToIntegrate)+trUtf8(" fichiers à intégrer.");
  label->setWordWrap(true);
  label->setStyleSheet("*{ color:red }");
  label->setText(labelText);
  radioButton -> setChecked(true);
  connect(pushButton,  SIGNAL(pressed()),this,SLOT(dansdocuments()));
  connect(pushButton_2,SIGNAL(pressed()),this,SLOT(close()));
  connect(pushButton_3,SIGNAL(pressed()),this,SLOT(configdialog()));
  connect(radioButton_2,SIGNAL(clicked()),this,SLOT(changeLabel()));
}

apidialog::~apidialog(){
    m_compteur  = 0 ;
    m_texteblob = "";
    m_login     = "";
    m_listelogin.clear();
    m_titres    .clear();
    }
////////////////////////////////////////////////////////////////////////////////
//fonction d'intégration dans documents
///////////////////////////////////////////////////////////////////////////////
bool apidialog::dansdocuments(){
  label->setText("");
  QSqlDatabase db = QSqlDatabase::database();
  QString user = comboBox->currentText();
  QDir dir(g_pathabsolu+"/apitemp");
  if(radioButton_2 -> isChecked()){
      dir.setPath(g_pathabsolu+"/classeur");
    }
  QStringList filters;
  filters << "*.txt" << "*.rtf" << "*.doc" << "*.hpr" << "*.odt" << "*.abw";
  dir.setNameFilters(filters);
  QStringList listresutext ;
  listresutext = dir.entryList();
  if(listresutext.size() == 0){
      QMessageBox::warning(0,tr("erreur"),trUtf8("erreur: il n'y a pas de fichier\n à intégrer !"),QMessageBox::Close);
      return false;
  }
/////////////////////////////////////////////////////
//boucle
////////////////////////////////////////////////////
  for(int i=0;i<listresutext.size();i++){
      QString texteavantblob;
      QString resutext = g_pathabsolu+"/apitemp/"+listresutext[i];
      if(radioButton_2 -> isChecked()){
          resutext = g_pathabsolu+"/classeur/"+listresutext[i];
      }
      QFile resutextfile(resutext);
      if(!resutextfile.open(QIODevice::ReadWrite|QIODevice::Text)){
           QMessageBox::warning(0,tr("erreur"),trUtf8("erreur ouverture fichier !"),QMessageBox::Ok);
	  }
      QStringList listedutexte;
      QTextStream stream(&resutextfile);
      /*char * codec = choosenCodec();
      QString codecString(codec);
      codecLabel->setText(codecString);
      stream.setCodec(codec);*///("ISO-8859-1");
      while(!stream.atEnd()){
          QString ligne = stream.readLine();
          /*if (ligne.contains("<"))
          {
          	ligne.replace("<","&#60");
          	}*/
         //ligne.replace("\n","<br/>");
         //ligne.replace("\r\n","<br/>");
         listedutexte << ligne;
         texteavantblob += ligne+"\n";//<br/>";
	  }
      /*texteavantblob.replace("\r","<br/>");
      texteavantblob.replace("\t"," ");
      texteavantblob.replace("\'","\\'");*/
      texteavantblob = replaceInHtml(texteavantblob);
      //texteavantblob = "Mois def&#233;vrier";
      
      QString nom ;
      QString prenom ;
      qDebug() << __FILE__ << QString::number(__LINE__) << "listedutexte.size() = " << QString::number(listedutexte.size());
      if (listedutexte.size() > 1)
      {
      	 nom = listedutexte[1];
         prenom = listedutexte[2];
          }
      if(radioButton_2 -> isChecked()){
          QStringList listFichier = listresutext[i].split("_");
          if (listFichier.size() < 3)
          {
          	QMessageBox::warning(0,"warning","Error name of file"+QString(__FILE__)+QString::number(__LINE__),QMessageBox::Ok);
          	return false;
              }
          nom = listFichier[0];
          prenom = listFichier[1];
      }
    if(nom.contains("'")){//integration des particularites semantiques du nom pour la syntaxe mysql
        nom.replace("'","''");
    }
    if(prenom.contains("'")){//integration des particularites semantiques du nom pour la syntaxe mysql
        prenom.replace("'","''");
    }
    QString name;
    QString surname;
    QString fchgnrliddos;
    QStringList listeiddos;
    QDateTime dateTime = QDateTime::currentDateTime();
    QSqlQuery query;
    if(!query.exec("SELECT FchGnrl_NomDos , FchGnrl_Prenom , FchGnrl_IDDos "
                   "from IndexNomPrenom WHERE FchGnrl_NomDos = '"+nom+"' AND FchGnrl_Prenom = '"+prenom+"';")){
        qWarning() << __FILE__ << " " << QString::number(__LINE__) << " " << query.lastError().text();
        }
  while(query.next())
	{
      name = query.value(0).toString();
      surname = query.value(1).toString();
      fchgnrliddos = query.value(2).toString();
      listeiddos << fchgnrliddos;
	}

  if(listeiddos.size() > 1 || listeiddos.size() == 0)
		{
      qDebug() << __FILE__ << QString::number(__LINE__) << "in textdialog" ;
      textdialog *text = new textdialog(name,surname,user,listedutexte,resutext);//nom,prénom,utilisateur,texte,chemin  du texte.
      text->show();
      break;
		}
  else{
      //intégration du texte dans rubriqueblobs
      qDebug() << __FILE__ << QString::number(__LINE__) << "in rubriqueblobs" ;
      switch(version){
      case 12 :
          m_texteblob = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone"
                    "=\"yes\" ?><MedinTux_Multimedia_data><HTML_Data><html><head><meta "
                    "name=\"qrichtext\" content=\"1\" /></head><body style=\"font-size:10pt;font-family:"
                    "Arial\"><p>"+texteavantblob+"</p></body></html></HTML_Data><ImageListe></ImageListe>"
                    "</MedinTux_Multimedia_data>";
          break;
      case 14 :
          m_texteblob = QString("<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body style=\"font-size:10pt;font-family:Arial\"><p>%1</p></body></html>")
                        .arg(texteavantblob);
          break;
      default :
          break;
      }
      QSqlQuery query1;
      if(!query1.exec("INSERT INTO RubriquesBlobs (RbDate_DataRub,RbDate_IDDos) VALUES ('"+m_texteblob+"','"+fchgnrliddos+"')")){
          qWarning() << __FILE__ << " " << QString::number(__LINE__) << " " << query1.lastError().text();
          }
      //intégration données dans rubriqueheads
      QString id_head = query1.lastInsertId().toString();
      qDebug() << __FILE__ << QString::number(__LINE__) << "id_head = " << id_head ;
      QString titre_head = fonctiontitre(listedutexte);
      qDebug() << "titre ="+titre_head << " " << __FILE__ << QString::number(__LINE__);
      if(radioButton_2 -> isChecked()){
          titre_head = resutext.split("_")[2];
          titre_head = titre_head.split(".")[0];
          }
          qDebug() << __FILE__ << QString::number(__LINE__) << "titre_head" <<  titre_head;
      if(titre_head == ""){
	      titre_head = "docs_externes";
	      }
      QDateTime datetime = QDateTime::currentDateTime();
      QString dateheure = datetime.toString("yyyy-MM-dd hh:mm:ss");
      //datetime = QDate::currentDateTime();
      QSqlQuery query2;
      if(!query2.exec("INSERT INTO RubriquesHead"
          "(RbDate_PrimKey,RbDate_IDDos,RbDate_TypeRub,RbDate_NomDate,RbDate_Date,RbDate_CreateUser,RbDate_CreateSignUser"
          ",RbDate_RefBlobs_Primkey)"
          " VALUES (NULL,'"+fchgnrliddos+"',20080000,'"+titre_head+"','"+dateheure+"','"+user+"','"+user+"','"+id_head+"')")){
          qWarning() << __FILE__ << " " << QString::number(__LINE__) << " " << query2.lastError().text();
              }
    if(query1.numRowsAffected()<1){
        QMessageBox::warning(0,tr("erreur"),""+query1.lastError().text()+"",QMessageBox::Ok);
        }
    else if(query2.numRowsAffected()<1){
        QMessageBox::warning(0,tr("erreur"),""+query2.lastError().text()+"",QMessageBox::Ok);
    }
    else{
      m_compteur += query2.numRowsAffected();
      m_dossCumulatedList << fchgnrliddos;
      resutextfile . copy(g_pathabsolu+"/apitempSauve/"+name+"_"+surname+"_"+dateTime.toString("yyyy-MM-dd-hh-mm-ss")+"_"+listresutext[i]);
      m_texteblob = "";
      name = "";
      surname = "";
      fchgnrliddos = "";
      listeiddos.clear();
      resutextfile.remove();
      }
    }

  }//for
  QString strDoss;
  foreach(strDoss,m_dossCumulatedList){
      qDebug() << __FILE__ << " " << QString::number(__LINE__) << " doss = " << strDoss;
      QSqlQuery queryResult;
      if(!queryResult.exec("SELECT FchGnrl_NomDos , FchGnrl_Prenom  FROM IndexNomPrenom WHERE FchGnrl_IDDos = '"+strDoss+"'")){
          qWarning() << __FILE__ << " " << QString::number(__LINE__) << " " << queryResult.lastError().text();
          }
      while(queryResult.next()){
          qDebug() << __FILE__ << " " << QString::number(__LINE__);
          m_namesIntegrated += queryResult.value(0).toString()+" "+queryResult.value(1).toString()+"\n";
          }
      }
    QString stringMess = m_namesIntegrated;
    qWarning() << __FILE__ << " " << QString::number(__LINE__) << " names = " << stringMess;
    QMessageBox::information(0,tr("information"),trUtf8("Intégration "
    "de ")+QString::number(m_compteur)+trUtf8(" documents\ndans la base.\n")
    +trUtf8("Les noms des patients sont : \n")+stringMess,QMessageBox::Ok);

    m_namesIntegrated = "";
    m_compteur = 0;


  return true;
}

void apidialog::configdialog(){
  config *configuration = new config;
  configuration->show();
}

QString apidialog::fonctiontitre(QStringList &stringlist){
  qDebug() << __FILE__ << QString::number(__LINE__) << "in fonctiontitre" ;
  QString titrechoisi = "";
	for(int i=0; i < m_titres.size(); i++){
	            if(m_titres[i].contains("=")){
	                        QStringList titresplit = m_titres[i].split("=");
	                        int ligne = 0;
	                        QString terme ;
	                        QString titre ;
	                        if (titresplit.size()> 2)
	                        {
	                        	ligne = titresplit[0].toInt();
	                                terme = titresplit[1];
	                                titre = titresplit[2];
	                            }
                    if (stringlist.size()< ligne)
                    {
                        qWarning() << __FILE__ << QString::number(__LINE__) << "stringlist.size()< " << QString::number(ligne);
                    	return QString();
                        }
                    else{
                        if(stringlist[ligne].contains(terme))
		            {
	                    titrechoisi = titre;
		            }
                        }
 		    }
			}//for
         qDebug() << __FILE__ << QString::number(__LINE__) << "titrechoisi = " << titrechoisi ;
  return titrechoisi;
}

void apidialog::changeLabel(){
    QDir dir(g_pathabsolu+"/classeur");
    QStringList list;
    list = dir.entryList();
    list.removeAll(".");
    list.removeAll("..");
    int numberOfFiles = list.size();
    qDebug() << __FILE__ << QString::number(__LINE__) << "numberOfFiles" << QString::number(numberOfFiles);
    QString labelText = trUtf8("Il y a ")+QString::number(numberOfFiles)+trUtf8(" fichiers à intégrer.");
    label->setWordWrap(true);
    label->setStyleSheet("*{ color:red }");
    label->setText(labelText);
}

/*char * apidialog::choosenCodec()
{
    char * codec;// = new char("UTF8");
    QFile codecFile(qApp->applicationDirPath()+"codecs");
    if (!codecFile.open(QIODevice::ReadOnly))
    {
    	  qWarning() << __FILE__ << QString::number(__LINE__) << "unable to open codecs " ;
        }
    QTextStream stream(&codecFile);
    while (!stream.atEnd())
    {
    	QString line = stream.readLine();
    	QString *ptrLine = new QString(line);
    	QByteArray* array = new QByteArray(ptrLine->toLocal8Bit());
    	if (!line.contains("#"))
    	{
    		codec = array->data()  ;
    	    }
        }
    return codec;
}*/

QString apidialog::replaceInHtml(const QString & text)
{
    QString htmlString;
    htmlString = text;
    //htmlString.replace("\r","<br/>");
    //htmlString.replace("\n","<br/>");
    htmlString.replace("\t"," ");
    htmlString.replace("\'","\\'");
    qDebug() << __FILE__ << QString::number(__LINE__) << " htmlString =" << htmlString ;
    for (int i = 0; i < m_hashHtml.count(); ++i)
    {
    	  QString key = m_hashHtml.keys()[i];
    	  QString htmlValue = m_hashHtml.value(key);
    	  //htmlValue.replace("&#","\\");
    	  htmlString.replace(key,htmlValue);
    	  qDebug() << __FILE__ << QString::number(__LINE__) << " key =" << key ;
    	  qDebug() << __FILE__ << QString::number(__LINE__) << "htmlValue  =" << htmlValue ;
        }
    htmlString.replace("\n","<br/>");
    qDebug() << __FILE__ << QString::number(__LINE__) << " htmlString after =" << htmlString ;
    return htmlString;
}

