/**
 * fichier extend.js
 * @module extend
 */

import _inherits from '@babel/runtime/helpers/inherits' ;
import log from './utils/log.js' ;

let hasLogged = false ;

/**
 * Utilisé pour sous-classer une classe existante en émulant le sous-classement ES à l'aide de la fonction
 * mot-clé `extends`.
 *
 * @fonction
 * @deprecated
 * @exemple
 * var MyComponent = videojs.extend(videojs.getComponent('Component'), {
 *   myCustomMethod : function() {
 *     // Faire des choses dans ma méthode.
 *   }
 * }) ;
 *
 * @param {Fonction} superClass
 *           La classe dont il faut hériter
 *
 * @param {Objet}   [subClassMethods={}]
 *           Méthodes de la nouvelle classe
 *
 * @return {Fonction}
 *           La nouvelle classe avec des méthodes de sous-classe qui ont hérité de superClass.
 */
const extend = function(superClass, subClassMethods = {}) {

  // Enregistrer un avertissement la première fois que extend est appelé pour signaler qu'il est obsolète
  // Il était précédemment déprécié dans notre documentation (les guides, en particulier),
  // mais n'a jamais été formellement déprécié dans le code.
  if (!hasLogged) {
    log.warn('videojs.extend is deprecated as of Video.js 7.22.0 and will be removed in Video.js 8.0.0') ;
    hasLogged = true ;
  }

  let subClass = function() {
    superClass.apply(this, arguments) ;
  };

  let methods = {} ;

  if (typeof subClassMethods === 'object') {
    if (subClassMethods.constructor !== Object.prototype.constructor) {
      subClass = subClassMethods.constructor ;
    }
    methods = subClassMethods ;
  } else if (typeof subClassMethods === 'function') {
    subClass = subClassMethods ;
  }

  _inherits(subClass, superClass) ;

  // cela est nécessaire pour la compatibilité ascendante et la compatibilité avec les nœuds.
  if (superClass) {
    subClass.super_ = superClass ;
  }

  // Extension du prototype de subObj avec des fonctions et d'autres propriétés provenant de props
  for (const name in methods) {
    if (methods.hasOwnProperty(name)) {
      subClass.prototype[name] = methods[name] ;
    }
  }

  return subClass ;
};

export default extend ;