/**
 * @file setup.js - Fonctions de configuration d'un lecteur sans
 * l'interaction avec l'utilisateur sur la base de l'"attribut" de l'étiquette vidéo.
 *
 * @module setup
 */
import * as Dom from './utils/dom' ;
import document from 'global/document' ;
import window from 'global/window' ;

let _windowLoaded = false ;
let videojs ;

/**
 * Configure toutes les balises qui ont un `attribut` data-setup au démarrage du lecteur.
 */
const autoSetup = function() {

  if (videojs.options.autoSetup === false) {
    retour ;
  }

  const vids = Array.prototype.slice.call(document.getElementsByTagName('video')) ;
  const audios = Array.prototype.slice.call(document.getElementsByTagName('audio')) ;
  const divs = Array.prototype.slice.call(document.getElementsByTagName('video-js')) ;
  const mediaEls = vids.concat(audios, divs) ;

  // Vérifier s'il existe des éléments multimédias
  if (mediaEls && mediaEls.length > 0) {

    for (let i = 0, e = mediaEls.length ; i < e ; i++) {
      const mediaEl = mediaEls[i] ;

      // Vérifier si l'élément existe et s'il dispose d'une fonction getAttribute.
      if (mediaEl && mediaEl.getAttribute) {

        // Assurez-vous que ce lecteur n'a pas déjà été configuré.
        if (mediaEl.player === undefined) {
          const options = mediaEl.getAttribute('data-setup') ;

          // Vérifier si data-setup attr existe.
          // Nous n'effectuons l'auto-setup que s'ils ont ajouté l'attr data-setup.
          if (options !== null) {
            // Créer une nouvelle instance video.js.
            videojs(mediaEl) ;
          }
        }

      // Si getAttribute n'est pas défini, nous devons attendre le DOM.
      } else {
        autoSetupTimeout(1) ;
        pause ;
      }
    }

  // Aucune vidéo n'a été trouvée, la boucle se poursuit donc jusqu'à ce que la page ait fini de se charger.
  } else if (!_windowLoaded) {
    autoSetupTimeout(1) ;
  }
};

/**
 * Attendez que la page soit chargée avant d'exécuter autoSetup. Il sera appelé en
 * autoSetup si `hasLoaded` retourne false.
 *
 * @param {number} wait
 *        Combien de temps attendre en ms
 *
 * @param {module:videojs} [vjs]
 *        La fonction de la bibliothèque videojs
 */
function autoSetupTimeout(wait, vjs) {
  // Protection contre les ruptures dans les environnements autres que les navigateurs
  if (!Dom.isReal()) {
    retour ;
  }

  if (vjs) {
    videojs = vjs ;
  }

  window.setTimeout(autoSetup, wait) ;
}

/**
 * Utilisé pour définir le suivi interne de l'état de chargement de la fenêtre à true.
 *
 * @private
 */
function setWindowLoaded() {
  _windowLoaded = true ;
  window.removeEventListener('load', setWindowLoaded) ;
}

if (Dom.isReal()) {
  if (document.readyState === 'complete') {
    setWindowLoaded() ;
  } else {
    /**
     * Écouter l'événement de chargement de la fenêtre et attribuer la valeur true à _windowLoaded.
     *
     * Nous utilisons ici un écouteur d'événements standard pour éviter d'incrémenter le GUID
     * avant la création de tout joueur.
     *
     * @listens load
     */
    window.addEventListener('load', setWindowLoaded) ;
  }
}

/**
 * vérifier si la fenêtre a été chargée
 */
const hasLoaded = function() {
  return _windowLoaded ;
};

export {autoSetup, autoSetupTimeout, hasLoaded} ;