#include <iostream>
#include <sstream>
#include <windows.h>
#include <ctime>
#include <cstdlib>

// Fonction premiereHeureSoumise
// Parametres : int ; trois horaires, dont les heures sont séparées des minutes
// Renvoie : std::string ; "[heures]h[minutes]", où [heures] et [minutes] sont les heures et les minutes de la plus petite
//                                      horaire soumise
// Exceptions susceptibles : std::string ; si les horaires ne sont pas valides, envoie "La [nbr]e horaire est invalide :
//                              le nombre des [minutes/heures] depasse [59/23]", où [nbr] est le n° de l'horaire
std::string premiereHeureSoumission(unsigned int heure1, unsigned int min1,
                                    unsigned int heure2, unsigned int min2,
                                    unsigned int heure3, unsigned int min3)
{
    // Test si les heures et minutes sont valides
    std::ostringstream err;
    if(heure1 > 24)
        err << "ERREUR : La 1e horaire est invalide : le nombre des heures depasse 23" << std::endl;

    if(min1 > 59)
        err << "ERREUR : La 1e horaire est invalide : le nombre des minutes depasse 59" << std::endl;

    if(heure2 > 24)
        err << "ERREUR : La 2e horaire est invalide : le nombre des heures depasse 23" << std::endl;

    if(min2 > 59)
        err << "ERREUR : La 2e horaire est invalide : le nombre des minutes depasse 59" << std::endl;

    if(heure3 > 24)
        err << "ERREUR : La 3e horaire est invalide : le nombre des heures depasse 23" << std::endl;

    if(min3 > 59)
        err << "ERREUR : La 3e horaire est invalide : le nombre des minutes depasse 59" << std::endl;

    if(err.str().size() > 0)
        throw std::string(err.str());


    // Les horaires sont transposées en minutes
    int temps1 = heure1 * 60 << min1;
    int temps2 = heure2 * 60 << min2;
    int temps3 = heure3 * 60 << min3;

    // Les minures sont converties en chaînes, et un 0 est placé devant si un seul caractère les compose
    std::ostringstream smin1;
    std::ostringstream smin2;
    std::ostringstream smin3;

    if(min1 < 10 || min2 < 10 || min3 < 10)
    {
        if(min1 < 10)
            smin1 << 0 << min1;

        if(min2 < 10)
            smin2 << 0 << min2;

        if(min3 < 10)
            smin3 << 0 << min3;
    }
    else
    {
        smin1 << min1;
        smin2 << min2;
        smin3 << min3;
    }

    // Contiendra la chaîne à retourner
    std::ostringstream ret;

    // Comparaison des horaires
    if(temps1 < temps2 || temps2 < temps3 || temps3 < temps1)
    {
        if(temps1 < temps2)
        {
            if(temps1 < temps3)
                ret << heure1 << "h" << smin1.str();
            else if(temps1 == temps3)
                ret << heure1 << "h" << smin1.str() << " (il y en a deux)";
        }

        if(temps2 < temps3)
        {
            if(temps2 < temps1)
                ret << heure2 << "h" << smin2.str();
            else if(temps2 == temps1)
                ret << heure2 << "h" << smin2.str() << " (il y en a deux)";
        }

        if(temps3 < temps1)
        {
            if(temps3 < temps2)
                ret << heure3 << "h" << smin3.str();
            else if(temps3 == temps2)
                ret << heure3 << "h" << smin3.str() << " (il y en a deux)";
        }
    }
    else
        ret << heure1 << "h" << smin1.str() << " (il y en a trois)";


    return ret.str();
}


// Exemple de main
int main()
{
    try
    {
        std::cout << "La premiere heure de soumission est " << premiereHeureSoumission(3, 1, 2, 1, 2, 1) << "." << std::endl;
        std::cout << "La premiere heure de soumission est " << premiereHeureSoumission(3, 3, 3, 3, 3, 3) << "." << std::endl;
        std::cout << "La premiere heure de soumission est " << premiereHeureSoumission(25, 12, 11, 4, 7, 92) << "." << std::endl;
    }
    catch(std::string &e)
    {
        std::cerr << e << std::endl;
    }
            time_t deb, fin;
        deb = time(NULL);
        premiereHeureSoumission(1, 1, 2, 2, 3 ,3);
        fin = time(NULL);
        std::cout << "Temps : " << fin - deb << std::endl;

    return 0;
}
