/*
    Fichier deplacemail.c
    Auteur Bernard Chardonneau

    Logiciel libre, droits d'utilisation précisés en français
    dans le fichier : licence-fr.txt

    Traductions des droits d'utilisation dans les fichiers :
    licence-de.txt , licence-en.txt , licence-es.txt ,
    licence-it.txt , licence-nl.txt , licence-pt.txt ,
    licence-eo.txt , licence-eo-utf.txt

    Droits d'utilisation également sur la page web :
    http://libremail.tuxfamily.org/voir.php?page=droits


    Ce programme déplace vers une autre boite aux lettres les mails
    en attente sur le serveur de messagerie.

    Une option permet de conserver les mails sélectionnés dans la
    boite aux lettres initiale. Dans ce cas, les mails sélectionnés
    sont seulement copiés.

    On peut choisir de déplacer :
    - tous les mails (fonctionnement par défaut)
    - un mail particulier identifié par son numéro

    Un fichier de configuration est utilisé pour se connecter à
    la boite aux lettres, pour connaitre l'adresse d'expédition
    et pour sélectionner le serveur SMTP servant à la réexpédition
    des mails.
    Il s'agit d'une variante des fichiers de configuration utilisés
    par la plupart des autres outils de libremail.
*/


#define appli   // pour la déclaration de variables globales à l'application

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"
#include "smtp.h"
#include "trtentete.h"
#include "copiedepl.h"


/* programme principal */

int main (int nbarg, char *varg[])
{
    char serv_smtp [120]; // nom du serveur smtp utilisé
    FILE *fconf;          // descripteur du fichier de configuration
    int  numail, nbmes;   // numéro du mail courant et nombre de mails
    int  optc;            // option : détermine si on conserve les mails déplacés

    // message signalant la copie ou le déplacement d'un mail
    char mess_copdepl [50];


    // récupération du nom de l'exécutable
    memcom (*varg);

    // se positionner sur le premier argument de deplacemail
    varg ++;

    // récupération de l'option de fonctionnement éventuelle
    if (--nbarg > 1 && **varg == '-')
    {
        // si option -c
        if (varg [0][1] == 'c')
            // les mails seront également conservés sur le serveur initial
            optc = 1;
        else
        {
            // "Option %s incorrecte"
            aff_err_arg ("ERR_OPTION", *varg);
            nbarg = 0;   // pour afficher la syntaxe de la commande
        }

        // décompter l'argument traité
        varg ++;
        nbarg --;
    }
    else
        // pas d'option -c : mails déplacés supprimés du serveur initial
        optc = 0;

    // récupérer le numéro du mail à traiter s'il a été spécifié
    if (nbarg && atoi (*varg) > 0)
    {
        numail = atoi (*varg);

        // décompter l'argument traité
        nbarg --;
        varg ++;
    }
    else
        numail = 0;  // on traitera tous les mails

    // controle du nombre d'arguments restant
    if (nbarg == 1)
    {
        // ouvrir le fichier de configuration
        fconf = ouvre_ficonf (*varg);

        if (fconf)
        {
            // connexion sur le compte mail du serveur pop
            if (connect_pop (fconf))
            {
                // récupérer et mémoriser les adresses
                // Email d'expédition et de destination
                mem_adr (adr_exped, fconf);
                mem_adr (adr_dest, fconf);

                // récupération du nombre de mails
                nbmes = nbmails ();

                // si des mails peuvent être traités
                if (nbmes)
                {
                    // recupérer le nom du serveur smtp
                    fgets (serv_smtp, 120, fconf);
                    serv_smtp [strlen (serv_smtp) - 1] = '\0';

                    // connexion au serveur smtp pour l'envoi des mails
                    if (connect_smtp (serv_smtp))
                    {
                        // mémorisation message adapté au traitement des mails
                        if (optc)
                            // "Copie du mail numéro %d"
                            strcpy (mess_copdepl, message ("COPIE_MAIL"));
                        else
                            // "Déplacement du mail numéro %d\n"
                            strcpy (mess_copdepl, message ("DEPL_MAIL"));

                        // si demande copie ou déplacement d'un mail particulier
                        if (numail)
                        {
                            // si un mail existe avec ce numéro
                            if (numail <= nbmes)
                            {
                                // message indiquant copie ou déplacement mail
                                printf (mess_copdepl, numail);

                                // envoyer une copie du mail à l'autre adresse
                                copiemail (numail);

                                // si déplacement des mails
                                if (! optc)
                                    // supprimer le mail du premier serveur
                                    detruitmail (numail);
                            }
                            // sinon, afficher un message d'erreur
                            else
                                // "Numéro de mail trop grand"
                                affiche_err ("NUMAIL_TROP_GRAND");
                        }
                        // sinon, on traitera tous les mails
                        else
                        {
                            // pour chaque mail du serveur
                            for (numail = 1; numail <= nbmes; numail++)
                            {
                                // message indiquant copie ou déplacement mail
                                printf (mess_copdepl, numail);
                                fflush (stdout);

                                // envoyer une copie du mail à l'autre adresse
                                copiemail (numail);

                                // si déplacement des mails
                                if (! optc)
                                    // supprimer le mail du premier serveur
                                    detruitmail (numail);
                            }
                        }

                        // pour l'affichage
                        putchar ('\n');

                        // fermeture de la connexion smtp
                        deconnect_smtp ();
                    }
                }

                // se déconnecter proprement du serveur pop
                deconnect_pop ();
            }

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
    }
    else
        // "Syntaxe : %s [-c] [numéro_mail] fichier_configuration"
        psyntaxe ("SYNT_DEPLACEMAIL");

    // pour faire plaisir à gcc qui veut une fonction main de type int
    return (0);
}