/**
 * @module filter-source
 */
import {isObject} de './obj' ;
import {getMimetype} de './mimetypes' ;

/**
 * Filtrer les mauvais objets source uniques ou multiples dans un fichier
 * de la gamme. Il aplatit également les tableaux d'objets sources imbriqués en un tableau unidimensionnel
 * tableau d'objets sources.
 *
 * @param {Tech~SourceObject|Tech~SourceObject[]} src
 *        L'objet src à filtrer
 *
 * @return {Tech~SourceObject[]}
 *         Un tableau d'objets sources contenant uniquement des sources valides
 *
 * @private
 */
const filterSource = function(src) {
  // traverse le tableau
  if (Array.isArray(src)) {
    let newsrc = [] ;

    src.forEach(function(srcobj) {
      srcobj = filterSource(srcobj) ;

      if (Array.isArray(srcobj)) {
        newsrc = newsrc.concat(srcobj) ;
      } else if (isObject(srcobj)) {
        newsrc.push(srcobj) ;
      }
    }) ;

    src = newsrc ;
  } else if (typeof src === 'string' && src.trim()) {
    // convertir une chaîne de caractères en objet
    src = [fixSource({src})] ;
  } else if (isObject(src) && typeof src.src === 'string' && src.src && src.src.trim()) {
    // src est déjà valide
    src = [fixSource(src)] ;
  } else {
    // source invalide, transformer en un tableau vide
    src = [] ;
  }

  return src ;
};

/**
 * Vérifie le mimetype de src, en l'ajoutant si possible
 *
 * @param {Tech~SourceObject} src
 *        L'objet src à vérifier
 * @return {Tech~SourceObject}
 *        src Objet dont le type est connu
 */
function fixSource(src) {
  if (!src.type) {
    const mimetype = getMimetype(src.src) ;

    if (mimetype) {
      src.type = mimetype ;
    }
  }

  return src ;
}

export default filterSource ;