/*_____________
Martin Robinson
lab14
gestion de date
Le programme demande à 
l’utilisateur d’entrer 
sa date de naissance et 
affiche sa date en texte <
avec son age.
_____________
preprocesseur*/

#include <iostream>
#include <time.h>

#include "../lib/saisieMR.hpp"

using namespace std;

/*_______
constante*/

const char nomMoi[][12] = { "Janvier", 
                            "Fevrier", 
                            "Mars", 
                            "Avril", 
                            "Mai", 
                            "Juin", 
                            "Juillet", 
                            "Aout", 
                            "Septembre", 
                            "Octobre", 
                            "Novembre", 
                            "Decembre"};

/*___________________
prototype de fonction*/

tm * dateAujourdhui();
tm * saisirDate(tm * maintenant);
int calculerAge(tm * maintenant, tm * naissance);

/*_________________
programme principal*/

int main()
{
    //initialistation
    saisie<void> pause("appuyer sur une touche pour continuer\n");   //foncteur de pause

    tm * maintenant = dateAujourdhui(),                 //date d'aujourd'hui
       * naissance = saisirDate(maintenant);            //date de naissance saisie au clavier
    int age = calculerAge(maintenant, naissance);       //age de la personne
                                                        //il n'y a pas besoin de plus d'information tout est là
                                                        //nous pouvont déjà calculer

    //affichage
    cout << "aujourd'hui on est le "
         << maintenant->tm_mday
         << " " << nomMoi[maintenant->tm_mon];
         
    if (age>=0)
        cout << " et vous avez "
             << calculerAge(maintenant, naissance)
             << " ans\n";
    else if (age==0)
        cout << " félicitation à vos parent pour avoir mis au monde au beau bébé qui sait déjà écrire sa date de naissance au clavier\n";
    else
        cout << " et vous n'etes pas encore né\n";
    
    return 0;
}

/*______
fonction*/

//la date d'aujourd'hui
tm * dateAujourdhui()
{
    time_t immediatement = time(0);
    return localtime(&immediatement);
}

//fonction de saisie avec validation, pas besoin de prototype car elle n'est pas appelé par le main
int saisirEntierValide(saisie<int>& saisirInt, int min, int max, const char * message, const char * messageErreur)
{
    bool ok;        //espace mémoire pour stocker la validation
    int valeur;     //valeur à valider
    do{
        cout << message;
        saisirInt >> valeur;
        ok = (valeur >= min && valeur <= max);
        if (!ok)
            cout << messageErreur;
    }while(!ok);
    return valeur;
}

//fonction de saisie de date
tm * saisirDate(tm * maintenant)
{
    //initialisation
    static tm date;                     //date à saisir, déclarer statiquement car les fonctions de time.h
                                        //on le caprice de fonctionner avec des pointeurs
    saisie<int> saisirInt("");                                         //foncteur de saisie d'entier, 
                                                                     //J'en ai besoin pour plusieurs 
                                                                     //message alors je ne lui en donne pas
    cout << "Entrer votre date de naissance (jj mm aaaa) : \n";
    //le jours
    date.tm_mday = saisirEntierValide(saisirInt, 1, 31,
                                      "Jours : ", 
                                      "\nil y a entre 1 et 31 jours dans un moi inclusivement\n");
    //le moi
    date.tm_mon = saisirEntierValide(saisirInt, 1, 12, 
                                     "moi : ",
                                     "\nil y a entre 1 et 12 mois dans une annee inclusivement\n") -1;  //commence à 0
    //l'année
    date.tm_year = saisirEntierValide(saisirInt, 1900, maintenant->tm_year+1900, 
                                      "annee : ",
                                      "\nla date devrais se retrouver entre 1900 et cette année\n")-1900; //commence à 0 pour 1900
    return &date;   //retourner un pointeur vers la variable statique
}

//calculer l'age
int calculerAge(tm * maintenant, tm * naissance)
{
    int age = maintenant->tm_year - naissance->tm_year;
    //si né à une année antérieur à cette année
    if (age>0)
        return age;
    //sinon , est-ce que le moi n'est pas déjà passé
    if (maintenant->tm_mon - naissance->tm_mon < 0)
        return -1;
    //sinon, est-ce que le jour est à venire
    if (maintenant->tm_mon - naissance->tm_mon == 0 &&
        maintenant->tm_mday - naissance->tm_mday < 0)
        return -1;
    //dans le dernier cas , la date est passé meme si c'est cette année
    return 0;
}

