/**
 * @file media-error.js
 */
import {assign, isObject} de './utils/obj' ;

/**
 * Une classe `MediaError` personnalisée qui imite la classe standard HTML5 `MediaError`.
 *
 * @param {numéro|chaîne|Objet|MediaError} valeur
 *        Il peut s'agir de plusieurs types :
 *        - number : devrait être un code d'erreur standard
 *        - string : un message d'erreur (le code sera 0)
 *        - Objet : propriétés arbitraires
 *        - `MediaError` (native) : utilisé pour remplir un objet `MediaError` de video.js
 *        - `MediaError` (video.js) : se retournera lui-même s'il est déjà un
 *          objet video.js `MediaError`.
 *
 * @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}
 * @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}
 *
 * @classe MediaError
 */
function MediaError(value) {

  // Autoriser les appels redondants à ce constructeur pour éviter d'avoir des `instanceof`
  // vérifications disséminées dans le code.
  if (value instanceof MediaError) {
    valeur de retour ;
  }

  if (typeof value === 'number') {
    this.code = valeur ;
  } else if (typeof value === 'string') {
    // le code par défaut est zéro, il s'agit donc d'une erreur personnalisée
    this.message = valeur ;
  } else if (isObject(value)) {

    // Nous assignons la propriété `code` manuellement parce que les objets `MediaError` natifs
    // ne pas l'exposer en tant que propriété propre/énumérable de l'objet.
    if (typeof value.code === 'number') {
      this.code = value.code ;
    }

    assign(this, value) ;
  }

  if (!this.message) {
    this.message = MediaError.defaultMessages[this.code] || '' ;
  }
}

/**
 * Le code d'erreur qui se réfère à deux des types définis `MediaError`
 *
 * @type {Nombre}
 */
MediaError.prototype.code = 0 ;

/**
 * Un message facultatif à afficher avec l'erreur. Le message ne fait pas partie de la norme HTML5
 * mais permet des erreurs personnalisées plus informatives.
 *
 * @type {String}
 */
MediaError.prototype.message = '' ;

/**
 * Un code d'état optionnel qui peut être défini par des plugins pour fournir encore plus de détails sur
 * l'erreur. Par exemple, un plugin peut fournir un code d'état HTTP spécifique et un code d'état
 * message d'erreur pour ce code. Ensuite, lorsque le plugin obtient cette erreur, cette classe va
 * savoir comment afficher un message d'erreur à ce sujet. Cela permet d'afficher un message personnalisé
 * sur l'écran d'erreur `Player`.
 *
 * @type {Array}
 */
MediaError.prototype.status = null ;

/**
 * Erreurs indexées par la norme W3C. La commande **NE PEUT PAS CHANGER** ! Voir le
 * énumérées sous {@link MediaError} pour plus d'informations.
 *
 * @enum {array}
 * en lecture seule
 * @property {string} 0 - MEDIA_ERR_CUSTOM
 * @property {string} 1 - MEDIA_ERR_ABORTED
 * @property {string} 2 - MEDIA_ERR_NETWORK
 * @property {string} 3 - MEDIA_ERR_DECODE
 * @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED
 * @property {string} 5 - MEDIA_ERR_ENCRYPTED
 */
MediaError.errorTypes = [
  'MEDIA_ERR_CUSTOM',
  'MEDIA_ERR_ABORTED',
  'MEDIA_ERR_NETWORK',
  'MEDIA_ERR_DECODE',
  'MEDIA_ERR_SRC_NOT_SUPPORTED',
  'MEDIA_ERR_ENCRYPTED' (EN FRANÇAIS DANS LE TEXTE)
] ;

/**
 * Les messages `MediaError` par défaut basés sur les {@link MediaError.errorTypes}.
 *
 * @type {Array}
 * @constant
 */
MediaError.defaultMessages = {
  1 : 'Vous avez interrompu la lecture du média',
  2 : une erreur de réseau a entraîné l'échec partiel du téléchargement des médias,
  3 : la lecture du média a été interrompue en raison d'un problème de corruption ou parce que le média utilisait des fonctions que votre navigateur ne prenait pas en charge,
  4 : le support n'a pas pu être chargé, soit parce que le serveur ou le réseau a échoué, soit parce que le format n'est pas pris en charge,
  5 : les médias sont cryptés et nous n'avons pas les clés pour les décrypter
};

// Ajouter les types en tant que propriétés sur MediaError
// par exemple, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4 ;
for (let errNum = 0 ; errNum < MediaError.errorTypes.length ; errNum++) {
  MediaError[MediaError.errorTypes[errNum]] = errNum ;
  // les valeurs doivent être accessibles à la fois à la classe et à l'instance
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum ;
}

// jsdocs pour les membres d'instance/statiques ajoutés ci-dessus
// les méthodes d'instance utilisent `#` et les méthodes statiques utilisent `.`
/**
 * Code d'erreur W3C pour toute erreur personnalisée.
 *
 * @member MediaError#MEDIA_ERR_CUSTOM
 * @constant {number}
 * @default 0
 */
/**
 * Code d'erreur W3C pour toute erreur personnalisée.
 *
 * @member MediaError.MEDIA_ERR_CUSTOM
 * @constant {number}
 * @default 0
 */

/**
 * Code d'erreur W3C pour l'erreur de média interrompue.
 *
 * @member MediaError#MEDIA_ERR_ABORTED
 * @constant {number}
 * @défaut 1
 */
/**
 * Code d'erreur W3C pour l'erreur de média interrompue.
 *
 * @member MediaError.MEDIA_ERR_ABORTED
 * @constant {number}
 * @défaut 1
 */

/**
 * Code d'erreur W3C pour toute erreur de réseau.
 *
 * @member MediaError#MEDIA_ERR_NETWORK
 * @constant {number}
 * @default 2
 */
/**
 * Code d'erreur W3C pour toute erreur de réseau.
 *
 * @member MediaError.MEDIA_ERR_NETWORK
 * @constant {number}
 * @default 2
 */

/**
 * Code d'erreur W3C pour toute erreur de décodage.
 *
 * @member MediaError#MEDIA_ERR_DECODE
 * @constant {number}
 * @default 3
 */
/**
 * Code d'erreur W3C pour toute erreur de décodage.
 *
 * @member MediaError.MEDIA_ERR_DECODE
 * @constant {number}
 * @default 3
 */

/**
 * Code d'erreur du W3C à chaque fois qu'une source n'est pas prise en charge.
 *
 * @member MediaError#MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constant {number}
 * @default 4
 */
/**
 * Code d'erreur du W3C à chaque fois qu'une source n'est pas prise en charge.
 *
 * @member MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constant {number}
 * @default 4
 */

/**
 * Code d'erreur du W3C à chaque fois qu'une source est cryptée.
 *
 * @member MediaError#MEDIA_ERR_ENCRYPTED
 * @constant {number}
 * @default 5
 */
/**
 * Code d'erreur du W3C à chaque fois qu'une source est cryptée.
 *
 * @member MediaError.MEDIA_ERR_ENCRYPTED
 * @constant {number}
 * @default 5
 */

export default MediaError ;