/*_______________________________________________
statistique météo
par Martin Robinson
saisir une série de donnée dans un fichier
et afficher un rapport.
température et précipitation mensuel
_________________________________________________
preprocesseur*/
#include "mois.hpp"

/*------------------------------------
methode privée
------------------------------------*/

//eliminer toute les variables
void mois::clear()
{
    if (_nom)
    {
        delete [] _nom;
        _nom = 0;
    }
    if (_tabdonnee[1])
    {
        delete [] _tabdonnee[1];
        delete [] _tabdonnee[0];
        _tabdonnee[0]=0;
        _tabdonnee[1]=0;
        _nbjour=0;
    }
}

//initialiser toute les variables
void mois::init(const char* nom, int jour, int stat[][31])
{
    //init
    int len=0;      //longueure du nom temporaire
    //verifier si l'objet n'est pas déjà plein
    if (!vide())
        clear();
    //compter le nombre de charactère dans le nom
    while(*(nom+len))
        len++;
    //créer dynamiquement le nouveau tableau char
    _nom = new char[len];
    //copier les charactères du nom
    for (int i=0;i<len;i++)
        *(_nom+i)=*(nom+i);
    //le tableau de donnée
    _nbjour = jour;
    for(int j=0;j<2;j++)
    {
        _tabdonnee[j] = new int[jour];
        for (int i=0;i<jour;i++)
            _tabdonnee[j][i] = stat[j][i];
    }
}

//test si le mois est vide
bool mois::vide()const
{
    if (_nom && _tabdonnee[0] && _tabdonnee[1] && _nbjour)
        return false;
    return true;
}


/*------------------------------------
methode publique
constructeur destructeur
------------------------------------*/

//constructeur par défaut avec vide
mois::mois()
{
    _nom = 0;
    _nbjour=0;
    _tabdonnee[0]=0;
    _tabdonnee[1]=0;
}

//constructeur avec parametre
mois::mois(const char* nom, int jour, int stat[][31])
{
    _nom = 0;
    _nbjour=0;
    _tabdonnee[0]=0;
    _tabdonnee[1]=0;
    init(nom,jour,stat);
}

//destructeur
mois::~mois()
{
    clear();
}

/*------------------------------------
methode publique
------------------------------------*/

//calcul de la moyenne des précipitations
float mois::moyPrecipitation()const
{
    if (vide())
        return 0;
    float sum=0;
    for (int i=0;i<_nbjour;i++)
        sum += _tabdonnee[1][i];
    return sum/_nbjour;
}

//calcul de la moyenne des temperatures
float mois::moyTemperature()const
{
    if (vide())
        return 0;
    float sum=0;
    for (int i=0;i<_nbjour;i++)
        sum += _tabdonnee[0][i];
    return sum/_nbjour;
}

//afficher le mois et le nombre de jour
void mois::printMois(ostream& sortie)const
{
    if (!vide())
        sortie << _nom << " " << _nbjour << " ";
}

//afficher les données
void mois::printDonnee(ostream& sortie)const
{
    const char * motcle[] = {"temperature", "precipitation"};
    if (!vide())
        for (int j=0;j<2;j++)
        {
            sortie << motcle[j] << " (";
            for (int i=0;i<_nbjour;i++)
                sortie << _tabdonnee[j][i] << " ";
            sortie << ")";
        }
}

//afficher les moyennes des précipitations et températures
void mois::printMoy(ostream& sortie)const
{
    if (!vide())
    {
        sortie << moyTemperature() << " " << moyPrecipitation() << endl;
    }
}

//saisire les données pour remplir l'objet
void mois::lire(istream& entree)
{
    //initialisation var temporaire
    char tmpNom[10],        //le nom du moi
         tmpMotcle[14],     //un mot clé pour validé le fichier
         tmpBracket;        //mauvais choix de mots pour les parenthese
    int tmpNbJour,          //nombre de jour à saisir
        tmpDonnee[2][31];   //le tableau de donné
    const char * motcle[] = {"temperature", "precipitation"};
                            //mots clé de validation

    //premiere saisie, nom et nombre de jour, valider
    entree >> tmpNom >> tmpNbJour;
    if (tmpNom[0]==0 || tmpNbJour==0)
        return;

    //saisir les donnée, et validé le mot clé
    for (int j=0;j<2;j++)
    {
        entree >> tmpMotcle >> tmpBracket;
        if (tmpBracket != '(')
            return;
        for (int i=0;i<11;i++)
            if (*(tmpMotcle+i) != *(motcle[j]+i))
                return;
        for (int i=0;i<tmpNbJour;i++)
            entree >> tmpDonnee[j][i];
        entree >> tmpBracket;
        if (tmpBracket != ')')
            return;
    }
    
    //succès, on efface le moi et initialise le nouveau
    if (!vide())
        clear();
    init(tmpNom,tmpNbJour,tmpDonnee);
}

//surcharge de cout avec formatage
ostream& operator<<(ostream& sortie, const mois& x)
{
//    x.printMois(sortie);
//    x.printDonnee(sortie);
    sortie << left << setw(30) << x._nom
           << right << setw(9) << fixed << setprecision(2) << x.moyTemperature()
           << right << setw(14) << fixed << setprecision(2) << x.moyPrecipitation() << endl;
    return sortie;
}

//surcharge de cin pour la saisie
istream& operator>>(istream& entree, mois& x)
{
    x.lire(entree);
    return entree;
}

