/**
 * @file audio-track-list.js
 */
import TrackList from './track-list' ;

/**
 * Partout où nous appelons cette fonction, nous nous écartons de la spécification
 * car nous ne prenons en charge qu'une seule piste audio activée à la fois
 *
 * @param {AudioTrackList} list
 *        liste sur laquelle travailler
 *
 * @param {AudioTrack} track
 *        La piste à sauter
 *
 * @private
 */
const disableOthers = function(list, track) {
  for (let i = 0 ; i < list.length ; i++) {
    if (!Object.keys(list[i]).length || track.id === list[i].id) {
      continuer ;
    }
    // une autre piste audio est activée, la désactiver
    list[i].enabled = false ;
  }
};

/**
 * La liste actuelle des {@link AudioTrack} d'un fichier multimédia.
 *
 * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist}
 * @extends TrackList
 */
class AudioTrackList extends TrackList {

  /**
   * Créer une instance de cette classe.
   *
   * @param {AudioTrack[]} [tracks=[]]
   *        Une liste de `AudioTrack` pour instancier la liste.
   */
  constructor(tracks = []) {
    // s'assurer qu'une seule piste est activée
    // trié du dernier index au premier index
    for (let i = tracks.length - 1 ; i >= 0 ; i--) {
      if (tracks[i].enabled) {
        disableOthers(tracks, tracks[i]) ;
        pause ;
      }
    }

    super(pistes) ;
    this.changing_ = false ;
  }

  /**
   * Ajoute un {@link AudioTrack} à la `AudioTrackList`.
   *
   * @param {AudioTrack} track
   *        La piste audio à ajouter à la liste
   *
   * @fires TrackList#addtrack
   */
  addTrack(track) {
    if (track.enabled) {
      disableOthers(this, track) ;
    }

    super.addTrack(track) ;
    // les pistes natives n'ont pas cette fonction
    if (!track.addEventListener) {
      retour ;
    }

    track.enabledChange_ = () => {
      // lorsque nous désactivons d'autres pistes (puisque nous ne prenons pas en charge les
      // plus d'une piste à la fois), nous définirons changing_
      // à true pour ne pas déclencher d'autres événements de changement
      if (this.changing_) {
        retour ;
      }
      this.changing_ = true ;
      disableOthers(this, track) ;
      this.changing_ = false ;
      this.trigger('change') ;
    };

    /**
     * @listens AudioTrack#enabledchange
     * @fires TrackList#change
     */
    track.addEventListener('enabledchange', track.enabledChange_) ;
  }

  removeTrack(rtrack) {
    super.removeTrack(rtrack) ;

    if (rtrack.removeEventListener && rtrack.enabledChange_) {
      rtrack.removeEventListener('enabledchange', rtrack.enabledChange_) ;
      rtrack.enabledChange_ = null ;
    }
  }
}

exporter la liste des pistes audio par défaut ;