/**
 * @file text-track-list-converter.js Utilitaires pour capturer l'état de la piste de texte et la
 * recréer des pistes à partir d'une capture.
 *
 * @module convertisseur texte-trace-liste
 */

/**
 * Examine un {@link TextTrack} unique et renvoie un objet javascript compatible JSON qui
 * représente l'état du {@link TextTrack}.
 *
 * @param {TextTrack} track
 *        La piste de texte à interroger.
 *
 * @return {Object}
 *         Une représentation javascript sérialisable de la piste de texte.
 * @private
 */
const trackToJson_ = function(track) {
  const ret = [
    type", "étiquette", "langue", "id",
    inBandMetadataTrackDispatchType", "mode", "src", "inBandMetadataTrackDispatchType", "mode", "src", "src"
  ].reduce((acc, prop, i) => {

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

    retour acc ;
  }, {
    cues : track.cues && Array.prototype.map.call(track.cues, function(cue) {
      retour {
        startTime : cue.startTime,
        endTime : cue.endTime,
        texte : cue.text,
        id : cue.id
      };
    })
  }) ;

  retour ret ;
};

/**
 * Examine un {@link Tech} et renvoie un tableau javascript compatible JSON qui représente le {@link Tech}
 * état de tous les {@link TextTrack} actuellement configurés. Le tableau de retour est compatible avec
 * {@link text-track-list-converter:jsonToTextTracks}.
 *
 * @param {Tech} tech
 *        L'objet technique à interroger
 *
 * @return {Array}
 *         Une représentation javascript sérialisable 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_)) ;
};

/**
 * Créer un ensemble de {@link TextTrack}s distants sur un {@link Tech} basé sur un tableau de javascript
 * objet {@link TextTrack} representations.
 *
 * @param {Array} json
 *        Un tableau d'objets de représentation `TextTrack`, comme ceux qui seraient
 *        produit par `textTracksToJson`.
 *
 * @param {Tech} tech
 *        La `Technologie` sur laquelle créer le `TextTrack`.
 */
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_} ;