#include <qmessagebox.h>
#include <qfile.h>
#include <qregexp.h>

void FormPop::init()
{
/* 
    lineEditServeur->setText("bigserv.btsinfogap.org");
    lineEditLogin->setText("jcmarin");
    lineEditPassword->setText("Ljhe+683");
*/
    lineEditServeur->setText("pop.pro.proxad.net");
    lineEditLogin->setText("triscorp@toparade.com");
    lineEditPassword->setText("Ljhe+683");

    //table1->setNumRows(0); // on défini le nombre de ligne du tableau à 0
    table1->setReadOnly(TRUE); // on ne peut pas éditer les informations affichées dans les cellules
}

void FormPop::envoiUser()
{
    qDebug("Envoi du USER");
    // Procédure qui envoi le USER au serveur
    *tsSocket<<"USER "<<lineEditLogin->text().latin1()<<"\r\n";
    etape="confirmation USER";
}

void FormPop::envoiPass()
{
    qDebug("Envoi du PASS");
    // Procédure qui envoi le PASS au serveur
    *tsSocket<<"PASS "<<lineEditPassword->text().latin1()<<"\r\n";      
    etape="confirmation PASS";
}

void FormPop::envoiStat()
{
    qDebug("Envoi du STAT");
    // Procédure qui envoi le STAT au serveur
    pushButtonConnecter->setText("Déconnecter");
    *tsSocket<<"STAT"<<"\r\n";
    etape="reception du STAT";
}

void FormPop::traitementSTAT()
{
    qDebug("Traitement du STAT");
    // Procédure qui traite les données renvoyées par le serveur pour le STAT
    QStringList tab;
    
    tab=QStringList::split(" ",messageServeur);
    textLabelInfo->setText("Vous avez "+tab[1]+" message(s).");
    nbmess=tab[1].toInt();
    messageCourant=1; // on définit le message courant à 1
    envoiTOP(); // on envoi un TOP pour le message courant
}

void FormPop::envoiTOP()
{
    qDebug("Envoi du TOP pour le message %d\n",messageCourant);
    // Procédure qui envoi le TOP {messageCourant} 0
    // soit une requete pour recevoir l'entete du message courant
    QString txt;
    
    txt=QString::number(messageCourant);
    *tsSocket<<"TOP "<<txt<<" 0"<<"\r\n";
    etape="reception des entetes des messages";
}

void FormPop::demandeTaille()
{
    // Procédure qui envoi le LIST {messageCourant}
    // soit une requete pour recevoir la taille en octect du message courant
    QString txt;
    
    txt=QString::number(messageCourant);
    *tsSocket<<"LIST "<<txt<<"\r\n";
    etape="reception de la taille d'un message";
}

void FormPop::traiteTaille()
{
    qDebug("Traitement d'un LIST sur message");
    // Procédure qui traite les données renvoyées par le serveur pour le LIST d'un message
    QStringList tab;
    
    tab=QStringList::split(" ",messageServeur);
    table1->setText(messageCourant-1,3,messageServeur);
    
    // on passe au message suivant
    if (messageCourant==nbmess) // on a finit la réception des messages
    	etape="fin reception mail";
    else // sinon, on passe au message suivant
    {
        messageCourant++;
        envoiTOP(); // Envoi d'un TOP pour le message courant
    }
}

QString renvoimois(QString mois)
{
    QString nummois;
    if (mois=="jan")
    	nummois="01";
    else if (mois=="feb")
    	nummois="02";
    else if (mois=="mar")
    	nummois="03";
    else if (mois=="avr")
    	nummois="04";
    else if (mois=="mai")
    	nummois="05";
    else if (mois=="jun")
    	nummois="06";
    else if (mois=="jui")
    	nummois="07";
    else if (mois=="aug")
    	nummois="08";
    else if (mois=="sep")
    	nummois="09";
    else if (mois=="oct")
    	nummois="10";
    else if (mois=="nov")
    	nummois="11";
    else if (mois=="dec")
    	nummois="12";
    else
    	nummois="??";
    return nummois;
}
void FormPop::traitementEntete()
{
    // Procédure qui traite les données renvoyées par le serveur pour un TOP {messageCourant} 0
    QStringList tabtotal,tab,tab2,datetab;
    QString txt,date,datestr;

    tabtotal=QStringList::split("\r\n",messageTotal);
    int t1=tabtotal.count();
    for (int i=0;i<t1;i++)
    {
    	tab=QStringList::split(" ",tabtotal[i]);
     	if (tab[0]=="Subject:") // si c'est l'objet du mesage, on l'ajoute
     	{
     	   table1->setText(messageCourant-1,1,tabtotal[i].mid(9,tabtotal[i].length()-9));
     	}
     	//else if (tab[0]=="Received:")
     	else if (tab[0]=="Date:") // Si c'est la date du messsage, on la traite et on l'ajoute
     	{
     	   date=tabtotal[i].mid(6,tabtotal[i].length()-6);
     	   
     	   // On recherche si la date contient bien une virgule
     	   int indice = date.find( QRegExp(","), 0 );
     	   if (indice==-1) // si ce n'est pas le cas, on rajoute une virgule
     	   	date="XX, "+date;
     	   
     	   // On recherche si la date contient bien une virgule suivit un espace
     	   indice = date.find( QRegExp(", "), 0 );
     	   if (indice==-1) // si ce n'est pas le cas, on rajoute un espace après la virgule
     	   {
     	   	indice = date.find( QRegExp(","), 0 );
     	   	date = date.replace( indice, 1, ", " );
     	   }
     	   // Le format de la date est maintenant bon !

           datetab=QStringList::split(" ",date);
           datestr=datetab[1]+"/"+renvoimois(datetab[2].lower())+"/"+datetab[3]+" à "+datetab[4];
           table1->setText(messageCourant-1,2,datestr);
        }
        else if (tab[0]=="From:") // Si c'est la date du messsage, on la traite et on l'ajoute
     	{
     	   table1->setText(messageCourant-1,0,tabtotal[i].mid(6,tabtotal[i].length()-6));
        }
        else
        {
        }
     }
     table1->setNumRows(messageCourant);
     table1->adjustColumn(0);
     table1->adjustColumn(1);
     table1->adjustColumn(2);
}
void FormPop::fileNew(){}
void FormPop::fileOpen(){}
void FormPop::fileSave(){}
void FormPop::fileSaveAs(){}
void FormPop::filePrint(){}
void FormPop::fileExit(){}
void FormPop::editUndo(){}
void FormPop::editRedo(){}
void FormPop::editCut(){}

void FormPop::connecter()
{
    if (pushButtonConnecter->text()=="Connecter")
    {
        //obtention de la socket
        qDebug("création de la socket");
        maSocket=new QSocket(this);
        qDebug("connexion au serveur");
        maSocket->connectToHost( lineEditServeur->text(), 110);
        //le port du serveur auquel on souhaite se connecter est le port 110 réservé au protocole pop
        tsSocket = new QTextStream( maSocket );
        //on attache le signal  recoitdonnées de la socket au slot recevpoir de notre forme
        connect ( maSocket, SIGNAL( readyRead() ), this, SLOT( recevoirDonnees() ) );
        etape="connexion au serveur";
        connect(table1, SIGNAL(clicked(int,int,int,const QPoint&)), this, SLOT(cliqueTable()));
    }
    else
    {
        *tsSocket<<"QUIT"<<"\r\n";
        etape="déconnection";
    }
}


void FormPop::cliqueTable()
{
	if (etape!="reception des entetes des messages" && etape!="déconnexion OK")
	{
		//int col=table1->currentColumn();
		int row=table1->currentRow()+1;
		QString row_str=QString::number(row);
		//QString col_str=QString::number(col);
		//QMessageBox::critical(this,"Cellule sélectionnée","Ligne : "+row_str+"\nColonne : "+col_str);
		textEdit2->clear();
		etape="recevoir le contenu d'un email";
		envoieCommande("RETR "+row_str);
	}
	else
	{
		QMessageBox::critical(this,"ERREUR DETECTEE","Impossible de lire le message sélectionné!\nVérifiez les points suivant :\n\n- Vous êtes actuellement connecté.\n- Vous n'êtes pas en train de télécharger les messages.");
	}
}
	
void FormPop::editPaste(){}
void FormPop::editFind(){}
void FormPop::helpIndex(){}
void FormPop::helpContents(){}
void FormPop::helpAbout(){}

void FormPop::envoieCommande(QString commande)
{
    /*
      envoie de la commande au serveur
      exemple:
      la commande STAT 
      permet d'obtenir le nombre de message et la taille total en octets
      la commande LIST
      permet d'obtenir pour chaque message sa taille en octet
      la commande QUIT
      ferme la connexion avec le seveur
      la commande TOP <y> <x>
      affiche les x premières lignes du message n°y
      la commande DELE <x>
      efface le message n° x
      etc...
      */
    *tsSocket<<commande<<"\r\n";
}

// Ce slot est exécuté à chaque fois que le serveur nous envoie quelque chose.
void FormPop::recevoirDonnees()
{
    QString txt,date;
    QStringList tab,datetab;

    if (etape=="reception des entetes des messages")
    {
    	tab=QStringList::split("\r\n",messageTotal);
    	if (tab[tab.count()-1]==".")
    		messageTotal="";
    }
    else
    	messageTotal="";

    while(maSocket->canReadLine()) //tant que le serveur nous envoie des lignes,
    {
        messageServeur = maSocket->readLine(); // Réception du message du serveur
        messageTotal = messageTotal + messageServeur;
    }

    //textEdit2->append("-----------------------ici------------------------");
    tab=QStringList::split("\r\n",messageTotal);
    
    if (etape=="reception des entetes des messages" && tab[tab.count()-1]==".")
    {
            traitementEntete();
	    FILE * fgroup;
	    txt=QString::number(messageCourant);
	    fgroup=fopen("./log"+txt+".txt","w"); //ouverture du fichier en mode écriture
	    QTextOStream fichier(fgroup);
	    int t1=tab.count();
	    for (int i=0;i<t1;i++)
		fichier << tab[i] << endl;
	    fclose(fgroup); // Fermeture du fichier groupe
	    
	    traitementEntete();
	    demandeTaille();
    }

    // Gestion des messages du serveur
    
    if (etape=="reception du STAT")
    {
    	traitementSTAT(); // On traite le STAT
    }
    else if (etape=="confirmation PASS")
    {
        envoiStat(); // Envoi du STAT
    }
    else if (etape=="confirmation USER")
    {
        envoiPass(); // Envoi du password au serveur
    }
    else if (etape=="connexion au serveur")
    {
    	envoiUser(); // Envoi du login au serveur
    }
    else if (etape=="déconnection")
    {
        qDebug("Déconnexion OK");
        pushButtonConnecter->setText("Connecter");
        table1->setNumRows(0); // on défini le nombre de ligne du tableau à 0
        etape=="déconnexion OK";
    }
    else if (etape=="recevoir le contenu d'un email")
    {
    	textEdit2->append(messageTotal);
    }
    else if (etape=="reception de la taille d'un message")
    {
    	traiteTaille(); // On traite la taille du mail
    }
    else
    {
    	qDebug("Reception de message incorrecte");
    }
}
