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("Les minutes et les secondes doivent etre entre 0 et 59 et les heures entre 0 et 29");
        }

        return seconds + minutes * 60 + hours * 3600;
    }

    /**
     * @return le nombre de seconde entre minuit et l'heure passé en argument.
     * 
     */
    @SuppressWarnings("deprecation")
    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("Le nombre de secondes ne doit pas être négatif");
        }
        
        if (spm < 0 || spm > 107999) {
            throw new IllegalArgumentException("Le nombre de secondes ne doit pas être supérieur à 107999");
        }

        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("Le nombre de secondes ne doit pas être négatif");
        }
        
        if (spm < 0 || spm > 107999) {
            throw new IllegalArgumentException("Le nombre de secondes ne doit pas être supérieur à 107999");
        }

        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("Le nombre de secondes ne doit pas être négatif");
        }
        
        if (spm < 0 || spm > 107999) {
            throw new IllegalArgumentException("Le nombre de secondes ne doit pas être supérieur à 107999");
        }

        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("Le nombre de secondes ne doit pas être négatif");
        }
        
        if (spm < 0 || spm > 107999) {
            throw new IllegalArgumentException("Le nombre de secondes ne doit pas être supérieur à 107999");
        }

        return String.format("%02d:%02d:%02d", hours(spm), minutes(spm),
                seconds(spm));
    }
}
