#include <qmessagebox.h>

void FormPop::init()
{
    lineEditServeur->setText("bigserv.btsinfogap.org");
    lineEditLogin->setText("jcmarin");
    lineEditPassword->setText("Ljhe+683");
}

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();
    table1->setNumRows(nbmess); // on défini le nombre de ligne du tableau
    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";
}

QString FormPop::renvoimois(QString mois)
{
    QString nummois="??";
    if (mois=="Mar")
        nummois="03";
    return nummois;
}
void FormPop::traitementEntete()
{
    // Procédure qui traite les données renvoyées par le serveur pour un TOP {messageCourant} 0
    QStringList tab,tab2,datetab;
    QString txt,date,datestr;
    
     tab=QStringList::split(" ",messageServeur);
     if (tab[0]=="Subject:") // si c'est l'objet du mesage, on l'ajoute
     {
         table1->setText(messageCourant-1,1,messageServeur.mid(9,messageServeur.length()-9-2));
     }
     if (tab[0]=="Received:") // Si c'est la date du messsage, on la traite et on l'ajoute
     {
         date=messageServeur.mid(11,messageServeur.length()-11-2);
         tab2=QStringList::split("; ",date);
         QString dateEntiere=tab2[1];
         datetab=QStringList::split(" ",dateEntiere);         
         //datestr=datetab[2];
         qDebug("nb cellule: %d\n",datetab.count());
         /*for(int i=0;i<datetab.count();i++)
         {
            qDebug("%s\n",datetab[i].latin1());
        }*/
         //datestr=datetab[1]+"/"+renvoimois(datetab[2])+"/"+datetab[3]+" à "+datetab[4];
         table1->setText(messageCourant-1,2,datestr);
     }
     if (tab[0]=="Status:") // Si c'est la fin de réception des donnés....
     {
         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
         }
     }
}
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";
    }
    else
    {
        *tsSocket<<"QUIT"<<"\r\n";
        etape="déconnection";
    }
}

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<<lineEditCommande->text().latin1()<<"\r\n";
    *tsSocket<<commande<<"\r\n";
}

void FormPop::recevoirDonnees()
{
    // Ce slot est exécuté à chaque fois que le serveur nous envoie quelque chose.
    QString txt,date;    
    //tant que le serveur nous envoie des lignes,
    //on ajoute la ligne reçue à TextEditMessages
    QStringList tab,datetab;
    
    while(maSocket->canReadLine())
    {
        messageServeur = maSocket->readLine(); // Réception du message du serveur
        textEdit2->append(messageServeur);
    }
    
    //textEdit2->append("-----------------------ici------------------------");
    
    if (etape=="reception des entetes des messages")
        traitementEntete();
    // Gestion des messages du serveur
    
    if (etape=="reception du STAT")
        traitementSTAT(); // On traite le STAT
    if (etape=="confirmation PASS")
        envoiStat(); // Envoi du STAT
    if (etape=="confirmation USER")
        envoiPass(); // Envoi du password au serveur
    if (etape=="connexion au serveur")
        envoiUser(); // Envoi du login au serveur
    if (etape=="déconnection")
    {
        qDebug("Déconnexion OK");
        pushButtonConnecter->setText("Connecter");
    }
}
