/**
 * @file format-time.js
 * @module format-time
 */

/**
 * Format des secondes sous forme de chaîne de temps, H:MM:SS ou M:SS. Fournir un guide (en
 * secondes) forcera un nombre de zéros en tête pour couvrir la longueur de l'article
 * guide.
 *
 * @private
 * @param {number} seconds
 *         Nombre de secondes à transformer en chaîne de caractères
 *
 * @param {number} guide
 *         Nombre (en secondes) après lequel la chaîne doit être modélisée
 *
 * @return {string}
 *         Heure formatée en H:MM:SS ou M:SS
 */
const defaultImplementation = function(seconds, guide) {
  seconds = seconds < 0 ? 0 : secondes ;
  let s = Math.floor(seconds % 60) ;
  let m = Math.floor(seconds / 60 % 60) ;
  let h = Math.floor(seconds / 3600) ;
  const gm = Math.floor(guide / 60 % 60) ;
  const gh = Math.floor(guide / 3600) ;

  // gérer les temps non valides
  if (isNaN(seconds) || seconds === Infinity) {
    // "-" est faux pour tous les opérateurs relationnels (par exemple <, >=), ce qui explique ce paramètre
    // ajoutera le nombre minimum de champs spécifié par le guide
    h = m = s = '-' ;
  }

  // Vérifier si nous devons afficher les heures
  h = (h > 0 || gh > 0) ? h + ':' : '' ;

  // Si les heures sont affichées, il peut être nécessaire d'ajouter un zéro initial.
  // Toujours afficher au moins un chiffre des minutes.
  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':' ;

  // Vérifier si le zéro initial est nécessaire pour les secondes
  s = (s < 10) ? '0' + s : s ;

  retour h + m + s ;
};

// Pointeur interne vers l'implémentation actuelle.
let implementation = defaultImplementation ;

/**
 * Remplace l'implémentation par défaut de formatTime par une implémentation personnalisée.
 *
 * @param {Fonction} customImplementation
 *        Une fonction qui sera utilisée à la place du formatTime par défaut
 *        la mise en œuvre. Recevra l'heure actuelle en secondes et le
 *        guide (en secondes) comme arguments.
 */
export function setFormatTime(customImplementation) {
  implementation = customImplementation ;
}

/**
 * Réinitialise formatTime à l'implémentation par défaut.
 */
export function resetFormatTime() {
  implementation = defaultImplementation ;
}

/**
 * Délègue à la fonction de formatage de l'heure par défaut ou à une fonction de formatage de l'heure personnalisée
 * fournie par `setFormatTime`.
 *
 * Formate les secondes sous forme de chaîne de temps (H:MM:SS ou M:SS). Fournir un
 * (en secondes) forcera un nombre de zéros initiaux à couvrir le guide de
 * longueur du guide.
 *
 * @statique
 * @exemple formatTime(125, 600) === "02:05"
 * @param {number} seconds
 *           Nombre de secondes à transformer en chaîne de caractères
 *
 * @param {number} guide
 *           Nombre (en secondes) après lequel la chaîne doit être modélisée
 *
 * @return {string}
 *           Heure formatée en H:MM:SS ou M:SS
 */
function formatTime(seconds, guide = seconds) {
  return implementation(seconds, guide) ;
}

exporter le format par défautTime ;