/**
 * @file html-track-element-list.js
 */

/**
 * La liste actuelle des {@link HtmlTrackElement}s.
 */
class HtmlTrackElementList {

  /**
   * Créer une instance de cette classe.
   *
   * @param {HtmlTrackElement[]} [tracks=[]]
   *        Une liste de `HtmlTrackElement` pour instancier la liste.
   */
  constructor(trackElements = []) {
    this.trackElements_ = [] ;

    /**
     * @memberof HtmlTrackElementList
     * @member {number} length
     *         Le nombre actuel de `Track`s dans ce Trackist.
     * @instance
     */
    Object.defineProperty(this, 'length', {
      get() {
        return this.trackElements_.length ;
      }
    }) ;

    for (let i = 0, length = trackElements.length ; i < length ; i++) {
      this.addTrackElement_(trackElements[i]) ;
    }
  }

  /**
   * Ajouter un {@link HtmlTrackElement} à la `HtmlTrackElementList`
   *
   * @param {HtmlTrackElement} trackElement
   *        L'élément de piste à ajouter à la liste.
   *
   * @private
   */
  addTrackElement_(trackElement) {
    const index = this.trackElements_.length ;

    if ( !(' + index in this)) {
      Object.defineProperty(this, index, {
        get() {
          return this.trackElements_[index] ;
        }
      }) ;
    }

    // Ne pas ajouter d'éléments en double
    if (this.trackElements_.indexOf(trackElement) === -1) {
      this.trackElements_.push(trackElement) ;
    }
  }

  /**
   * Obtenir un {@link HtmlTrackElement} de la `HtmlTrackElementList` à partir d'un élément
   * {@link TextTrack}.
   *
   * @param {TextTrack} track
   *        La piste associée à un élément de piste.
   *
   * @return {HtmlTrackElement|undefined}
   *         L'élément de piste trouvé ou non défini.
   *
   * @private
   */
  getTrackElementByTrack_(track) {
    let trackElement_ ;

    for (let i = 0, length = this.trackElements_.length ; i < length ; i++) {
      if (track === this.trackElements_[i].track) {
        trackElement_ = this.trackElements_[i] ;

        pause ;
      }
    }

    return trackElement_ ;
  }

  /**
   * Supprimer un {@link HtmlTrackElement} de la `HtmlTrackElementList`
   *
   * @param {HtmlTrackElement} trackElement
   *        L'élément de piste à retirer de la liste.
   *
   * @private
   */
  removeTrackElement_(trackElement) {
    for (let i = 0, length = this.trackElements_.length ; i < length ; i++) {
      if (trackElement === this.trackElements_[i]) {
        if (this.trackElements_[i].track && typeof this.trackElements_[i].track.off === 'function') {
          this.trackElements_[i].track.off() ;
        }

        if (typeof this.trackElements_[i].off === 'function') {
          this.trackElements_[i].off() ;
        }
        this.trackElements_.splice(i, 1) ;
        pause ;
      }
    }
  }
}

export default HtmlTrackElementList ;