import {AudioTrackKind} from './track-enums' ;
import Track from './track' ;
import merge from '../utils/merge-options' ;

/**
 * Une représentation d'une seule `Piste Audio`. S'il fait partie d'une {@link AudioTrackList}
 * seule une `Piste audio` de la liste sera activée à la fois.
 *
 * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack}
 * @extends Track
 */
class AudioTrack extends Track {

  /**
   * Créer une instance de cette classe.
   *
   * @param {Objet} [options={}]
   *        Objet de noms et de valeurs d'options
   *
   * @param {AudioTrack~Kind} [options.kind='']
   *        Un type de piste audio valide
   *
   * @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.
   *
   * @param {boolean} [options.enabled]
   *        Si cette piste est celle qui est en cours de lecture. Si cette piste fait partie de
   *        une {@link AudioTrackList}, une seule {@link AudioTrack} sera activée.
   */
  constructor(options = {}) {
    const settings = merge(options, {
      genre : AudioTrackKind[options.kind] || ''
    }) ;

    super(settings) ;

    let enabled = false ;

    /**
     * @membre d'AudioTrack
     * @member {boolean} enabled
     *         Si cette `Piste Audio` est activée ou non. Lors du réglage, cela
     *         déclenche {@link AudioTrack#enabledchange} si l'état de enabled est modifié.
     * @instance
     *
     * @fires VideoTrack#selectedchange
     */
    Object.defineProperty(this, 'enabled', {
      get() {
        retour activé ;
      },
      set(newEnabled) {
        // une valeur non valide ou inchangée
        if (typeof newEnabled !== 'boolean' || newEnabled === enabled) {
          retour ;
        }
        enabled = newEnabled ;

        /**
         * Un événement qui se déclenche lorsque des modifications sont apportées à cette piste. Cela permet
         * l'AudioTrackList qui contient cette piste pour agir en conséquence.
         *
         * > Remarque : Cela ne fait pas partie de la spécification ! Les pistes natives feront l'affaire
         *         en interne sans qu'il y ait d'événement.
         *
         * @event AudioTrack#enabledchange
         * @type {EventTarget~Event}
         */
        this.trigger('enabledchange') ;
      }
    }) ;

    // si l'utilisateur définit cette piste comme étant sélectionnée, alors
    // fixe la valeur sélectionnée à cette valeur réelle dans le cas contraire
    // nous le gardons faux
    if (settings.enabled) {
      this.enabled = settings.enabled ;
    }
    this.loaded_ = true ;
  }
}

exporter la piste audio par défaut ;