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

/**
 * Eine Track-Klasse, die die gesamte gemeinsame Funktionalität für {@link AudioTrack} enthält,
 * {@link VideoTrack}, und {@link TextTrack}.
 *
 * > Anmerkung: Diese Klasse sollte nicht direkt verwendet werden
 *
 * @siehe {@link https://html.spec.whatwg.org/multipage/embedded-content.html}
 * @extends EventTarget
 * @Abstrakt
 * /
class Track extends EventTarget {

  /**
   * Erstellen Sie eine Instanz dieser Klasse.
   *
   * @param {Object} [options={}]
   *        Objekt der Optionsnamen und -werte
   *
   * @param {string} [options.kind='']
   *        Ein gültiger Typ für die Art der Spur, die Sie erstellen.
   *
   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]
   *        Eine eindeutige ID für diesen AudioTrack.
   *
   * @param {string} [options.label='']
   *        Die Menübezeichnung für diesen Titel.
   *
   * @param {string} [options.language='']
   *        Ein gültiger zweistelliger Sprachcode.
   *
   * @Abstrakt
   * /
  constructor(options = {}) {
    super();

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

    let label = options.label || '';

    /**
     * @MitgliedderSpur
     * @member {string} id
     *         Die ID dieses Titels. Kann nach der Erstellung nicht geändert werden.
     * @Instanz
     *
     * @readonly
     * /

    /**
     * @MitgliedderSpur
     * @member {string} kind
     *         Die Art von Track, die dies ist. Kann nach der Erstellung nicht geändert werden.
     * @Instanz
     *
     * @readonly
     * /

    /**
     * @MitgliedderSpur
     * @member {string} Sprache
     *         Der aus zwei Buchstaben bestehende Sprachcode für diesen Titel. Kann nicht geändert werden nach
     *         erstellung.
     * @Instanz
     *
     * @readonly
     * /

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

    /**
     * @MitgliedderSpur
     * @member {string} label
     *         Die Bezeichnung dieses Titels. Kann nach der Erstellung nicht geändert werden.
     * @Instanz
     *
     * @fires Track#labelchange
     * /
    Object.defineProperty(this, 'label', {
      get() {
        rücksendeetikett;
      },
      set(newLabel) {
        if (newLabel !== label) {
          label = newLabel;

          /**
           * Ein Ereignis, das ausgelöst wird, wenn sich das Label auf dieser Spur ändert.
           *
           * > Anmerkung: Dies ist nicht Teil der Spezifikation!
           *
           * @event Track#labelchange
           * @Typ {EventTarget~Event}
           * /
          this.trigger('labelchange');
        }
      }
    });
  }
}

standard Track exportieren;