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

import EventTarget from '../event-target' ;
import TextTrack from '../tracks/text-track' ;

/**
 * @memberof HTMLTrackElement
 * @typedef {HTMLTrackElement~ReadyState}
 * @enum {number}
 */
const NONE = 0 ;
const LOADING = 1 ;
const LOADED = 2 ;
const ERROR = 3 ;

/**
 * Une seule piste représentée dans le DOM.
 *
 * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement}
 * @extends EventTarget
 */
class HTMLTrackElement extends EventTarget {

  /**
   * Créer une instance de cette classe.
   *
   * @param {Objet} options={}
   *        Objet de noms et de valeurs d'options
   *
   * @param {Tech} options.tech
   *        Une référence au tech qui possède cet élément HTMLTrackElement.
   *
   * @param {TextTrack~Kind} [options.kind='subtitles']
   *        Un type de texte valide.
   *
   * @param {TextTrack~Mode} [options.mode='disabled']
   *        Un mode de suivi de texte valide.
   *
   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]
   *        Un identifiant unique pour ce TextTrack.
   *
   * @param {string} [options.label='']
   *        L'étiquette du menu pour cette piste.
   *
   * @param {string} [options.language='']
   *        Un code linguistique valide à deux caractères.
   *
   * @param {string} [options.srclang='']
   *        Un code linguistique valide à deux caractères. Une alternative, mais dépourvue de priorité
   *        version de `options.language`
   *
   * @param {string} [options.src]
   *        Une url vers les indices TextTrack.
   *
   * @param {boolean} [options.default]
   *        Si cette piste doit être activée ou désactivée par défaut.
   */
  constructor(options = {}) {
    super() ;

    let readyState ;

    const track = new TextTrack(options) ;

    this.kind = track.kind ;
    this.src = track.src ;
    this.srclang = track.language ;
    this.label = track.label ;
    this.default = track.default ;

    Object.defineProperties(this, {

      /**
       * @memberof HTMLTrackElement
       * @member {HTMLTrackElement~ReadyState} readyState
       *         L'état de préparation actuel de l'élément de piste.
       * @instance
       */
      readyState : {
        get() {
          return readyState ;
        }
      },

      /**
       * @memberof HTMLTrackElement
       * @member {TextTrack} track
       *         L'objet TextTrack sous-jacent.
       * @instance
       *
       */
      la piste : {
        get() {
          piste de retour ;
        }
      }
    }) ;

    readyState = NONE ;

    /**
     * @listens TextTrack#loadeddata
     * @fires HTMLTrackElement#load
     */
    track.addEventListener('loadeddata', () => {
      readyState = LOADED ;

      this.trigger({
        type : "load",
        cible : ceci
      }) ;
    }) ;
  }
}

HTMLTrackElement.prototype.allowedEvents_ = {
  charge : 'load'
};

HTMLTrackElement.NONE = NONE ;
HTMLTrackElement.LOADING = LOADING ;
HTMLTrackElement.LOADED = LOADED ;
HTMLTrackElement.ERROR = ERROR ;

exporter l'élément HTMLTrackElement par défaut ;