/**
 * @file duration-display.js
 */
import TimeDisplay from './time-display' ;
import Component from '../../component.js' ;

/**
 * Affiche la durée
 *
 * @extends Component
 */
class DurationDisplay extends TimeDisplay {

  /**
   * Crée une instance de cette classe.
   *
   * @param {Player} player
   *        Le `Player` auquel cette classe doit être attachée.
   *
   * @param {Objet} [options]
   *        La mémoire clé/valeur des options du lecteur.
   */
  constructor(player, options) {
    super(player, options) ;

    const updateContent = (e) => this.updateContent(e) ;

    // nous ne voulons pas/nous n'avons pas besoin d'étrangler les changements de durée,
    // car ils doivent toujours afficher la durée modifiée en tant que
    // il a changé
    this.on(player, 'durationchange', updateContent) ;

    // Écouter loadstart car la durée du lecteur est réinitialisée lorsqu'un nouvel élément multimédia est chargé,
    // mais le changement de durée sur l'agent utilisateur ne sera pas déclenché.
    // @see [Spec]{@link https://www.w3.org/TR/2011/WD-html5-20110113/video.html#media-element-load-algorithm}
    this.on(player, 'loadstart', updateContent) ;

    // Écoute également timeupdate (dans le parent) et loadedmetadata car la suppression de ces éléments est nécessaire
    // les auditeurs auraient pu interrompre les applications/bibliothèques dépendantes. Ces
    // peut probablement être supprimé pour la version 7.0.
    this.on(player, 'loadedmetadata', updateContent) ;
  }

  /**
   * Construit le DOM par défaut `className`.
   *
   * @return {string}
   *         Le `nom de classe` du DOM pour cet objet.
   */
  buildCSSClass() {
    return 'vjs-duration' ;
  }

  /**
   * Affichage de la durée de la mise à jour.
   *
   * @param {EventTarget~Event} [event]
   *        L'événement `durationchange`, `timeupdate`, ou `loadedmetadata` qui a causé
   *        cette fonction doit être appelée.
   *
   * @listens Player#durationchange
   * @listens Player#timeupdate
   * @listens Player#loadedmetadata
   */
  updateContent(event) {
    const duration = this.player_.duration() ;

    this.updateTextNode_(duration) ;
  }
}

/**
 * Texte ajouté à l'affichage de la durée pour les utilisateurs de lecteurs d'écran.
 *
 * @type {string}
 * @private
 */
DurationDisplay.prototype.labelText_ = 'Durée' ;

/**
 * Le texte qui doit s'afficher au-dessus des contrôles `DurationDisplay`. Ajouté pour la localisation.
 *
 * @type {string}
 * @private
 *
 * @deprecated in v7 ; controlText_ n'est pas utilisé dans les composants d'affichage non actifs
 */
DurationDisplay.prototype.controlText_ = 'Durée' ;

Component.registerComponent('DurationDisplay', DurationDisplay) ;
export default DurationDisplay ;