/*
    Fichier cremail.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 permet de saisir un Email

    On peut choisir les destinataires à partir du carnet d'adresses
    ou en saisir de nouveaux

    Le fichier obtenu est ensuite stoqué dans le répertoire des mails à envoyer
    Pour que cela soit possible, il faut :
    - soit que la commande cremail soit lancée depuis la chaine vmail...
    - soit préciser le nom du répertoire de l'arborescence des mails
*/


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

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "messages.h"
#include "buflect.h"
#include "numail.h"
#include "genentete.h"
#include "modepage.h"
#include "carspe.h"


/* prototypes */
void gene_entete (char *sujetmail, char *nomfic);


/* variable globale au source
   (pour éviter des passages de paramètres) */


long numail;  // numéro que prendra le mail généré


/* programme principal */

int main (int nbarg, char *varg[])
{
    char ficmail [szchemin]; // fichier mail de réponse
    char fentete [szchemin]; // fichier contenant l'entete du message
    char sujet [200];        // sujet du mail
    char commande [szchemin + 13];  // pour saisir le message
    char *editeur;           // éditeur utilisé pour saisir les mails
    unsigned long heuredeb;  // pour détecter si on appelle un éditeur graphique


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

    // on démarre avec la configuration standard du clavier
    mode_normal ();

    // si nombre d'arguments correct
    if (nbarg <= 2)
        // récupérer le nom du répertoire des mails à envoyer
        recupdirenv (nbarg, varg [1]);
    else
        // sinon, rappel de la syntaxe de la commande
        // "Syntaxe : %s [répertoire_emails]"
        psyntaxe ("SYNT_CREMAIL");

    // saisir le sujet du mail
    // "Sujet du mail : "
    affiche_msg_nocr ("SUJET_NOUVMAIL");
    fgets (sujet, sizeof (sujet), stdin);

    // si sujet trop long pour rentrer dans le buffer
    if (sujet [strlen (sujet) - 1] != '\n')
    {
        // mettre le passage à la ligne manquant
        sujet [strlen (sujet) - 1] = '\n';

        // et ignorer la fin de ligne
        fflush (stdin);
    }

    // créer un nom de fichier temporaire pour le message
    // il a toujours le même nom pour éviter de polluer le
    // répertoire d'envoi en cas de fausse manoeuvre opérateur
    sprintf (ficmail, "%s/tmp-mes", direnv);

    // Choix de l'éditeur de textes
    editeur = getenv ("EDITOR");

    if (! editeur)
        editeur = "vi";

    // saisir le message

    // fabriquer la commande à éxécuter
    sprintf (commande, "%s %s", editeur, ficmail);

    // récupérer l'heure courante
    heuredeb = time (0);

    // lancer la commande
    system (commande);

    // si la commande a rendu la main très rapidement
    if (time (0) <= heuredeb + 1)
    {
        // "Tapez sur la touche entrée en cas d'erreur de lancement de"
        // "l'éditeur ou après avoir sauvé le mail depuis un éditeur graphique"
        affiche_msg ("ATTENTE_ENTREE1");
        affiche_msg_nocr ("ATTENTE_ENTREE2");

        // attendre confirmation de l'opérateur
        while (getchar () != '\n')
            ;
    }

    // sortie si arrêt de la saisie
    if (access (ficmail, 0) < 0)
        // "Arrêt de la saisie par l'opérateur"
        errfatale ("ARRET_SAISIE", 0);

    // charger le carnet d'adresses
    charge_carnet_adr ();

    // créer un nom de fichier temporaire pour l'entête du mail
    sprintf (fentete, "%s/tmp-ent", direnv);

    // fabriquer l'entête du mail de réponse
    gene_entete (sujet, fentete);

    // mémoriser les dates et heure d'envoi du message
    ajout_date (fentete);

    // on va regrouper l'entête et le message dans un fichier numéroté définitif
    fusionner (fentete, numail, ficmail);

    // ajouter la signature au message, si elle existe
    ajout_sign (ficmail);

    // mettre à jour le fichier numail du répertoire de sortie
    sauv_num_dermail (direnv, numail);

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


/* génère l'entête du mail que l'on transfère */

void gene_entete (char *sujetmail, char *nomfic)
{
    // fabriquer et ouvrir en écriture le fichier d'entête
    fdest = fopen (nomfic, "w");

    if (! fdest)
        // "Impossible de créer un fichier d'entête %s"
        errfatale ("IMPOS_CRE_ENTETE", nomfic);

    // récupérer l'adresse de l'expéditeur
    lire_exped ();

    // chercher le numéro du mail que l'on va créer
    numail = num_dermail (direnv) + 1;

    // génération du champ Message-Id
    gen_mes_id (fdest, numail, buf_lect);

    // y copier l'expéditeur du message
    ajouts = 0;
    ajout_adr (buf_lect, "From");
    fputc ('\n', fdest);

    // configurer la liaison clavier pour lecture directe avec timeout
    mode_raw ();

    // Choix des destinataires
    debpage ();
    effpage ();

    // "Destinataires principaux"
    affiche_msg_nocr ("PRINCIP_DEST");
    attendre (1);
    choixdest ("To");
    effpage ();

    // "Voulez vous mettre des destinataires en copie ? "
    affiche_msg_nocr ("ACCEPT_DEST_CC");

    if (tolower (leccar ()) != 'n')
    {
        putchar ('\n');
        choixdest ("Cc");
    }
    else
        putchar ('\n');

    effpage ();
    // "Voulez vous mettre des destinataires en copie cachée ? "
    affiche_msg_nocr ("ACCEPT_DEST_BCC");

    if (tolower (leccar ()) != 'n')
    {
        putchar ('\n');
        choixdest ("Bcc");
    }

    putchar ('\n');
    effpage ();

    // retour à la configuration standard du clavier
    mode_normal ();

    // génération du champ Subject
    fprintf (fdest, "Subject: %s", sujetmail);

    // jeu de caractères du message
    fprintf (fdest, "Content-Type: text/plain; charset=");

    if (util_utf8 ())
        fprintf (fdest, "UTF-8;\n");
    else
        fprintf (fdest, "ISO-8859-15;\n");

    // mode d'encodage
    fprintf (fdest, "Content-Transfer-Encoding: 8bit\n");

    // un copyright qui n'est pas celui d'Outlook ;-))
    // "libremail : logiciel libre multilingue"
    fprintf (fdest, "User-Agent: libremail : %s\n",
                     message ("QUALIF_LIBREMAIL"));

    // permettra de relire ce fichier
    fclose (fdest);
}