/*
    Fichier listesimexped.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étruit les mail du serveur dont le nom de l'expéditeur
    indiqué diffère d'un petit nombre de caractères d'un nom d'expéditeur
    figurant dans une liste.

    La liste des noms d'expéditeurs à tester est mémorisée dans un
    fichier.

    Un fichier de configuration est utilisé pour se connecter à la
    boite aux lettres.
*/


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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"
#include "testchamp.h"
#include "datecour.h"
#include "simexped.h"
#include "szchemin.h"


/* variables globales au source
   (pour éviter des tonnes de passages de paramètres) */


char **listexped;      // mémorise les noms d'expéditeurs à tester
int  sz_listexped;     // nombre d'expéditeurs mémorisés dans listexped

// chaine de caractère mémorisée pour éviter appels répétitifs à message ()
char mess_analys [50]; // message signalant l'analyse d'un mail


/* programme principal */

int main (int nbarg, char *varg[])
{
    // fichier contenant la liste des chaines à tester
    char fichliste [szchemin + 12];
    char *car_fichliste; // pointeur sur un caractère de ce fichier
    FILE *fconf;         // descripteur du fichier de configuration
    FILE *ftrace;        // fichier contenant les expéditeurs des mail refusés
    int  numes, nbmes;   // muméro du mail courant et nombre de mails
    int  nbdiff;         // nombre de différences dans le nom d'expéditeur
    int  nbmaxdiff;      // nombre max de différences dans le nom d'expéditeur
    char bufFrom [120];  // buffer contenant l'expéditeur du mail
    char bufw [120];     // buffer d'envoi d'une requête de destruction de mail
    char datecour [10];  // date courante (pour le fichier des mails refusés)
    int  conserves = 0;  // nombre de mails conservés
    int  supprimes = 0;  // nombre de mails supprimés


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

    // se positionner sur le premier argument de listesimexped
    nbarg --;
    varg ++;

    // initialisation des valeurs des options
    nbmaxdiff = 1;   // une seule différence par défaut
    ftrace = NULL;   // pas de fichier trace

    // tant qu'il peut y avoir des options à traiter
    while (nbarg > 1)
    {
        // si nombre de différence maximal passé en paramètre
        if (atoi (*varg) > 0)
        {
            // récupérer ce nombre
            nbmaxdiff = atoi (*varg);

            // sauter l'argument traité
            nbarg --;
            varg ++;
        }
        // sinon si option -t (trace des mails supprimés)
        else if (**varg == '-' && varg [0][1] == 't')
        {
            // ouvrir le fichier trace en écriture fin de fichier
            ftrace = fopen (varg [1], "a");

            // si nom de fichier correct
            if (ftrace)
                // initialiser la date courante
                initdatecour (datecour);
            else
                // sinon, avertir l'utilisateur
                // "Impossible d'écrire dans le fichier %s"
                aff_err_arg ("IMPOS_ECR_FICH", varg [1]);

            // sauter les arguments traités
            nbarg -= 2;
            varg  += 2;
        }
        // aucune autre option n'est reconnue
        else
        {
            // "Option %s incorrecte"
            aff_err_arg ("ERR_OPTION", *varg);
            nbarg = 0;  // pour rappeller la syntaxe
        }
    }

    // contrôle du nombre d'arguments restants
    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 le nom du répertoire racine de la messagerie
                fgets (fichliste, szchemin, fconf);

                // fabriquer le chemin d'accès au fichier contenant les
                // noms d'expéditeurs à tester : <racine>/simexped
                car_fichliste = fichliste + strlen (fichliste);
                *(car_fichliste - 1) = '/';
                strcpy (car_fichliste, ficdir ("FIC_SIMEXPED"));

                // charger en mémoire les noms d'expéditeurs à tester
                listexped = charge_valchamp (fichliste, &sz_listexped);

                // si la liste n'est pas vide
                if (sz_listexped)
                {
                    // récupération du nombre de mails
                    nbmes = nbmails ();

                    // Initialisation du message à afficher à chaque
                    // analyse de mail  "\rAnalyse du mail n° %d"
                    strcpy (mess_analys, message ("ANALYSE_MAIL"));

                    // vérification des différents mails
                    for (numes = 1; numes <= nbmes; numes++)
                    {
                        // "\rAnalyse du mail n° %d"
                        printf (mess_analys, numes);
                        fflush (stdout);

                        // recupérer l'expéditeur du mail
                        recup_exped (numes, bufFrom);

                        // compter les différences par rapport
                        // au nom d'expéditeur le plus proche
                        nbdiff = simexped (bufFrom, listexped, sz_listexped);

                        // s'il y a des différences, mais pas trop
                        if (nbdiff && nbdiff <= nbmaxdiff)
                        {
                            // demande de destruction du mail
                            sprintf (bufw, "DELE %d", numes);
                            env_pop (bufw);
                            lire_pop ();
                            supprimes ++;

                            // si utilisation d'un fichier trace
                            if (ftrace)
                                // mémoriser le mail supprimé dans ce fichier
                                fprintf (ftrace, "%s %d %s\n",
                                                 datecour, nbdiff, bufFrom);
                        }
                        // sinon, conserver le mail
                        else
                            conserves ++;
                    }

                    // édition d'un récapitulatif
                    // "\n%d messages conservés, %d supprimés\n"
                    printf (message ("BILAN_FILTRAGE"), conserves, supprimes);
                }

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

                // si des mails ont été supprimés
                if (supprimes)
                    // attendre pour enregistrement correct des suppressions
                    // (évite problème si autre filtre appelé juste après)
                    sleep (2);
            }

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
    }
    else
        // "Syntaxe : %s [nbmaxdiff] [-t fichier_trace] fich_configuration"
        psyntaxe ("SYNT_SUPSIMEXP");

    return (0);
}