
package ch.epfl.isochrone.timetable;

/**
 * Classe servant à stocker des heures
 * 
 * @author Charles Thiebaut (238935) 
 * @author Arnaud Delamare (234841)
 *
 */
public final class SecondsPastMidnight {
    public static final int INFINITE=200000;
    
    private SecondsPastMidnight(){ }
    
    
    /**
     * @param hours
     *       le nombre d'heures de l'heure.
     * @param minutes 
     *       le nombre de minute de l'heure. 
     * @param secondes 
     *       le nombre de seconde de l'heure
     *       
     * @throws IllegalArgumentException
     *         si un des arguments est négatifs ou s'il dépasse le nombre maximal autorisé
     * 
     * @return le nombre de seconde entre minuit et l'heure passé en argument. 
     *
     */  
    public static int fromHMS(int hours, int minutes, int seconds)
    {
        if (hours<0 || minutes<0 || seconds<0 || hours >=30 || minutes>=60 || seconds>=60)
        {
            throw new IllegalArgumentException();
        }
        
        return seconds + minutes*60 + hours*3600;
    }
    
    /**
     * @return le nombre de seconde entre minuit et l'heure passé en argument. 
     *
     */  
    public static int fromJavaDate(java.util.Date date)
    {
        return fromHMS(date.getHours(), date.getMinutes(), date.getSeconds());
    }
    
    
    /**
     * @param spm 
     *        le nombre de seconde que l'on souhaite convertir. 
     *        
     * @throws IllegalArgumentException
     *         si le nombre de seconde est négatif ou si il dépasse la limite fixé.          
     * 
     * @return le nombre d'heure correspondant a l'heure en seconde passé en argument. 
     */  
    public static int hours(int spm)
    {
        if (spm<0 || spm>107999)  
        {
            throw new IllegalArgumentException();
        }
        
        return spm/3600;
    }
    
    /**
     * @param spm 
     *        le nombre de seconde que l'on souhaite convertir. 
     *        
     * @throws IllegalArgumentException
     *         si le nombre de seconde est négatif ou si il dépasse la limite fixé.          
     * 
     * @return le nombre de minute correspondant a l'heure en seconde passé en argument. 
     */  
    public static int minutes(int spm)
    {
        if (spm<0 || spm>107999)
        {
            throw new IllegalArgumentException();
        }
        
        spm=spm%3600;
        return spm/60;
    }
    
    /**
     * @param spm 
     *        le nombre de seconde que l'on souhaite convertir. 
     *        
     * @throws IllegalArgumentException
     *         si le nombre de seconde est négatif ou si il dépasse la limite fixé.          
     * 
     * @return le nombre de seconde correspondant a l'heure en seconde passé en argument. 
     */  
    public static int seconds(int spm)
    {
        if (spm<0 || spm>107999)
        {
            throw new IllegalArgumentException();
        }
        
        spm=spm%3600;
        return spm%60;
    }
    
    /**
     * @param spm 
     *        l'heure en seconde
     *
     * @throws IllegalArgumentException
     *         si l'heure est négative ou supérieure à la valeur prédéfinis.
     *          
     * 
     * @return l'heure au format textuelle. 
     */  
    public static String toString(int spm)
    {
        if (spm<0 || spm>107999)
        {
            throw new IllegalArgumentException();
        }
        
        return String.format("%02d:%02d:%02d", hours(spm), minutes(spm), seconds(spm));
    }
}
