/**
 * fichier url.js
 * @module url
 */
import document from 'global/document' ;
import window from 'global/window' ;

/**
 * @typedef {Objet} url:URLObject
 *
 * @property {string} protocole
 *           Le protocole de l'url qui a été analysé.
 *
 * @property {string} nom d'hôte
 *           Le nom d'hôte de l'url qui a été analysé.
 *
 * @property {string} port
 *           Le port de l'url qui a été analysé.
 *
 * @property {string} pathname
 *           Le chemin de l'url qui a été analysé.
 *
 * @property {string} search
 *           La requête de recherche de l'URL qui a été analysée.
 *
 * @property {string} hash
 *           Le hash de l'url qui a été analysé.
 *
 * @property {string} host
 *           L'hôte de l'url qui a été analysée.
 */

/**
 * Résoudre et analyser les éléments d'une URL.
 *
 * @fonction
 * @param {String} url
 *           L'url à analyser
 *
 * @return {url:URLObject}
 *           Un objet contenant les détails de l'url
 */
export const parseUrl = function(url) {
  // Toute cette méthode peut être remplacée par une URL une fois que nous serons en mesure d'abandonner IE11

  const props = ['protocole', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'] ;

  // ajouter l'URL à une ancre et laisser le navigateur analyser l'URL
  const a = document.createElement('a') ;

  a.href = url ;

  // Copier les propriétés spécifiques de l'URL dans un nouvel objet
  // Ceci est également nécessaire pour IE car l'ancre perd son caractère
  // propriétés lorsqu'il est retiré de la dom
  const details = {} ;

  for (let i = 0 ; i < props.length ; i++) {
    details[props[i]] = a[props[i]] ;
  }

  // IE ajoute le port à la propriété de l'hôte, contrairement à tous les autres. Si
  // un identifiant de port est ajouté pour les ports standard, le supprimer.
  if (details.protocol === 'http:') {
    details.host = details.host.replace(/:80$/, '') ;
  }

  if (details.protocol === 'https:') {
    details.host = details.host.replace(/:443$/, '') ;
  }

  if (!details.protocol) {
    details.protocol = window.location.protocol ;
  }

  /* istanbul ignore si */
  if (!details.host) {
    details.host = window.location.host ;
  }

  les détails du retour ;
};

/**
 * Obtenir la version absolue de l'URL relative. Utilisé pour indiquer à Flash l'URL correcte.
 *
 * @fonction
 * @param {string} url
 *           URL à rendre absolue
 *
 * @return {string}
 *           URL absolu
 *
 * voir http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
 */
export const getAbsoluteURL = function(url) {
  // Vérifier si l'URL est absolue
  if (!url.match(/^https?:\N/\N/)) {
    // Convertir en URL absolue. Le flash hébergé hors site nécessite une URL absolue.
    // ajouter l'URL à une ancre et laisser le navigateur analyser l'URL
    const a = document.createElement('a') ;

    a.href = url ;

    url = a.href ;
  }

  retourner l'url ;
};

/**
 * Renvoie l'extension du nom de fichier transmis. Il renvoie une chaîne vide
 * si un chemin d'accès non valide lui est transmis.
 *
 * @fonction
 * @param {string} path
 *           Le chemin d'accès au nom de fichier comme '/path/to/file.mp4'
 *
 * @return {string}
 *           L'extension en minuscules ou une chaîne vide s'il n'y en a pas
 *           a pu être trouvée.
 */
export const getFileExtension = function(path) {
  if (typeof path === 'string') {
    const splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/;
    const pathParts = splitPathRe.exec(path) ;

    if (pathParts) {
      return pathParts.pop().toLowerCase() ;
    }
  }

  retourner '' ;
};

/**
 * Retourne si l'url passée est une requête inter-domaine ou non.
 *
 * @fonction
 * @param {string} url
 *           L'url à vérifier.
 *
 * @param {Object} [winLoc]
 *           le domaine pour lequel l'url doit être vérifiée, la valeur par défaut est window.location
 *
 * @param {string} [winLoc.protocol]
 *           Le protocole d'emplacement de la fenêtre est par défaut window.location.protocol
 *
 * @param {string} [winLoc.host]
 *           La valeur par défaut de l'emplacement de la fenêtre est window.location.host
 *
 * @return {boolean}
 *           Qu'il s'agisse d'une demande interdomaines ou non.
 */
export const isCrossOrigin = function(url, winLoc = window.location) {
  const urlInfo = parseUrl(url) ;

  // Les urls relatives au protocole IE8 renverront ':' pour le protocole
  const srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol ;

  // Vérifier si l'url est celle d'un autre domaine/origine
  // IE8 ne connaît pas location.origin, nous ne nous y fierons donc pas ici
  const crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host) ;

  return crossOrigin ;
};