/**
 * @file track.js
 */
import * as Guid from '../utils/guid.js' ;
import EventTarget from '../event-target' ;

/**
 * Une classe Track qui contient toutes les fonctionnalités communes à {@link AudioTrack},
 * {@link VideoTrack}, et {@link TextTrack}.
 *
 * > Remarque : Cette classe ne doit pas être utilisée directement
 *
 * @see {@link https://html.spec.whatwg.org/multipage/embedded-content.html}
 * @extends EventTarget
 * @abstract
 */
class Track extends EventTarget {

  /**
   * Créer une instance de cette classe.
   *
   * @param {Objet} [options={}]
   *        Objet de noms et de valeurs d'options
   *
   * @param {string} [options.kind='']
   *        Un type valide pour le type de piste que vous créez.
   *
   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]
   *        Un identifiant unique pour cette piste audio.
   *
   * @param {string} [options.label='']
   *        L'étiquette du menu pour cette piste.
   *
   * @param {string} [options.language='']
   *        Un code linguistique valide à deux caractères.
   *
   * @abstract
   */
  constructor(options = {}) {
    super() ;

    const trackProps = {
      id : options.id || 'vjs_track_' + Guid.newGUID(),
      kind : options.kind || '',
      language : options.language || ''
    };

    let label = options.label || '' ;

    /**
     * @memberof Track
     * @member {string} id
     *         L'identifiant de cette piste. Ne peut pas être modifié après la création.
     * @instance
     *
     * en lecture seule
     */

    /**
     * @memberof Track
     * @member {string} kind
     *         Le genre de piste que c'est. Ne peut pas être modifié après la création.
     * @instance
     *
     * en lecture seule
     */

    /**
     * @memberof Track
     * @member {string} language
     *         Code linguistique à deux lettres pour cette piste. Ne peut être modifié après
     *         création.
     * @instance
     *
     * en lecture seule
     */

    for (const key in trackProps) {
      Object.defineProperty(this, key, {
        get() {
          return trackProps[key] ;
        },
        set() {}
      }) ;
    }

    /**
     * @memberof Track
     * @member {string} label
     *         L'étiquette de ce titre. Ne peut pas être modifié après la création.
     * @instance
     *
     * @fires Track#labelchange
     */
    Object.defineProperty(this, 'label', {
      get() {
        étiquette de retour ;
      },
      set(newLabel) {
        if (newLabel !== label) {
          label = newLabel ;

          /**
           * Un événement qui se déclenche en cas de changement d'étiquette sur cette piste.
           *
           * > Remarque : Cela ne fait pas partie de la spécification !
           *
           * @event Track#labelchange
           * @type {EventTarget~Event}
           */
          this.trigger('labelchange') ;
        }
      }
    }) ;
  }
}

exporter la piste par défaut ;