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

/**
 * Désélectionner toutes les autres {@link VideoTrack} sélectionnées.
 *
 * @param {VideoTrackList} list
 *        liste sur laquelle travailler
 *
 * @param {VideoTrack} 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 vidéo est activée, la désactiver
    list[i].selected = false ;
  }
};

/**
 * La liste actuelle des {@link VideoTrack} d'une vidéo.
 *
 * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist}
 * @extends TrackList
 */
class VideoTrackList extends TrackList {

  /**
   * Créer une instance de cette classe.
   *
   * @param {VideoTrack[]} [tracks=[]]
   *        Une liste de `VideoTrack` 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].selected) {
        disableOthers(tracks, tracks[i]) ;
        pause ;
      }
    }

    super(pistes) ;
    this.changing_ = false ;

    /**
     * @member {number} VideoTrackList#selectedIndex
     *         L'index actuel de la {@link VideoTrack`} sélectionnée.
     */
    Object.defineProperty(this, 'selectedIndex', {
      get() {
        for (let i = 0 ; i < this.length ; i++) {
          if (this[i].selected) {
            retour i ;
          }
        }
        retourner -1 ;
      },
      set() {}
    }) ;
  }

  /**
   * Ajoute un {@link VideoTrack} à la `VideoTrackList`.
   *
   * @param {VideoTrack} track
   *        La piste vidéo à ajouter à la liste
   *
   * @fires TrackList#addtrack
   */
  addTrack(track) {
    if (track.selected) {
      disableOthers(this, track) ;
    }

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

    track.selectedChange_ = () => {
      if (this.changing_) {
        retour ;
      }
      this.changing_ = true ;
      disableOthers(this, track) ;
      this.changing_ = false ;
      this.trigger('change') ;
    };

    /**
     * @listens VideoTrack#selectedchange
     * @fires TrackList#change
     */
    track.addEventListener('selectedchange', track.selectedChange_) ;
  }

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

    if (rtrack.removeEventListener && rtrack.selectedChange_) {
      rtrack.removeEventListener('selectedchange', rtrack.selectedChange_) ;
      rtrack.selectedChange_ = null ;
    }
  }
}

exporter la VideoTrackList par défaut ;