/**
 * @file text-track-list-converter.js Dienstprogramme zum Erfassen des Textspurstatus und
 * wiedererstellung von Tracks auf der Grundlage einer Aufnahme.
 *
 * @modul text-track-list-konverter
 * /

/**
 * Untersucht einen einzelnen {@link TextTrack} und gibt ein JSON-kompatibles Javascript-Objekt zurück, das
 * stellt den Zustand des {@link TextTrack} dar.
 *
 * @param {TextTrack} track
 *        Die abzufragende Textspur.
 *
 * @return {Object}
 *         Eine serialisierbare Javascript-Darstellung der TextSpur.
 * @privat
 * /
const trackToJson_ = function(track) {
  const ret = [
    art", "Bezeichnung", "Sprache", "id",
    'inBandMetadataTrackDispatchType', 'mode', 'src'
  ].reduce((acc, prop, i) => {

    if (track[prop]) {
      acc[prop] = track[prop];
    }

    return acc;
  }, {
    cues: track.cues && Array.prototype.map.call(track.cues, function(cue) {
      Rückkehr {
        startTime: cue.startTime,
        endTime: cue.endTime,
        text: cue.text,
        id: cue.id
      };
    })
  });

  return ret;
};

/**
 * Untersucht eine {@link Tech} und gibt ein JSON-kompatibles Javascript-Array zurück, das die
 * status aller derzeit konfigurierten {@link TextTrack}s. Das Rückgabe-Array ist kompatibel mit
 * {@link text-track-list-converter:jsonToTextTracks}.
 *
 * @param {Tech} tech
 *        Das abzufragende Tech-Objekt
 *
 * @return {Array}
 *         Eine serialisierbare Javascript-Darstellung des {@link Tech}s
 *         {@link TextTrackList}.
 * /
const textTracksToJson = function(tech) {

  const trackEls = tech.$$('track');

  const trackObjs = Array.prototype.map.call(trackEls, (t) => t.track);
  const tracks = Array.prototype.map.call(trackEls, function(trackEl) {
    const json = trackToJson_(trackEl.track);

    if (trackEl.src) {
      json.src = trackEl.src;
    }
    return json;
  });

  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function(track) {
    return trackObjs.indexOf(track) === -1;
  }).map(trackToJson_));
};

/**
 * Erstellen einer Reihe von entfernten {@link TextTrack}s auf einer {@link Tech} basierend auf einem Array von javascript
 * objekt {@link TextTrack} Darstellungen.
 *
 * @param {Array} json
 *        Ein Array von `TextTrack`-Darstellungsobjekten, wie die, die
 *        erzeugt von `textTracksToJson`.
 *
 * @param {Tech} tech
 *        Die Technik, mit der der TextTrack erstellt wird.
 * /
const jsonToTextTracks = function(json, tech) {
  json.forEach(function(track) {
    const addedTrack = tech.addRemoteTextTrack(track).track;

    if (!track.src && track.cues) {
      track.cues.forEach((cue) => addedTrack.addCue(cue));
    }
  });

  return tech.textTracks();
};

export default {textTracksToJson, jsonToTextTracks, trackToJson_};