/**
 * @file media-error.js
 * /
importar {asignar, isObject} desde './utils/obj';

/**
 * Una clase `MediaError` personalizada que imita la clase `MediaError` estándar de HTML5.
 *
 * @param {número|cadena|Objeto|Error de medios} valor
 * Esta puede ser de múltiples tipos:
 * - número: debe ser un código de error estándar
 * - cadena: un mensaje de error (el código será 0)
 * - Objeto: propiedades arbitrarias
 * - `MediaError` (nativo): se usa para completar un objeto video.js `MediaError`
 * - `MediaError` (video.js): se devolverá si ya es un
 * objeto video.js `MediaError`.
 *
 * @ver [Especificación de error de medios]{@enlace https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}
 * @ver [Especificación de error de medios cifrados]{@enlace https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}
 *
 * @clase MediaError
 * /
function MediaError(valor) {

  // Permitir llamadas redundantes a este constructor para evitar tener `instanceof`
  // cheques salpicados alrededor del código.
  if (valor instancia de MediaError) {
    valor de retorno;
  }

  if (tipo de valor === 'número') {
    este.código = valor;
  } else if (tipo de valor === 'cadena') {
    // el código predeterminado es cero, por lo que se trata de un error personalizado
    este.mensaje = valor;
  } más si (esObjeto(valor)) {

    // Asignamos la propiedad `code` manualmente porque los objetos nativos `MediaError`
    // no lo exponga como una propiedad propia/enumerable del objeto.
    if (tipodevalor.código === 'número') {
      este.código = valor.código;
    }

    asignar (esto, valor);
  }

  if (!este.mensaje) {
    este.mensaje = MediaError.defaultMessages[este.código] || '';
  }
}

/**
 * El código de error que hace referencia a dos de los tipos `MediaError` definidos
 *
 * @teclea un número}
 * /
MediaError.prototipo.código = 0;

/**
 * Un mensaje opcional que mostrar con el error. El mensaje no es parte del HTML5
 * especificaciones de video pero permite errores personalizados más informativos.
 *
 * @tipo {Cadena}
 * /
MediaError.prototipo.mensaje = '';

/**
 * Un código de estado opcional que se puede configurar mediante complementos para permitir aún más detalles sobre
 * el error. Por ejemplo, un complemento puede proporcionar un código de estado HTTP específico y un
 * mensaje de error para ese código. Luego, cuando el complemento recibe ese error, esta clase
 * saber cómo mostrar un mensaje de error para ello. Esto permite que se muestre un mensaje personalizado
 * arriba en la superposición de error `Player`.
 *
 * @tipo {Array}
 * /
MediaError.prototype.status = nulo;

/**
 * Errores indexados por el estándar W3C. ¡El pedido ** NO SE PUEDE CAMBIAR **! Ver el
 * especificación enumerada en {@link MediaError} para obtener más información.
 *
 * @enum {matriz}
 * @solo lectura
 * @property {cadena} 0 - MEDIA_ERR_CUSTOM
 * @propiedad {cadena} 1 - MEDIA_ERR_ABORTED
 * @propiedad {cadena} 2 - MEDIA_ERR_NETWORK
 * @propiedad {cadena} 3 - MEDIA_ERR_DECODE
 * @property {cadena} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED
 * @propiedad {cadena} 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'
];

/**
 * Los mensajes `MediaError` predeterminados basados en {@link MediaError.errorTypes}.
 *
 * @tipo {Array}
 * @constante
 * /
MediaError.defaultMessages = {
  1: 'Usted canceló la reproducción de medios',
  2: 'Un error de red provocó que la descarga de medios fallara parcialmente.',
  3: 'La reproducción de medios se canceló debido a un problema de corrupción o porque los medios usaban características que su navegador no admitía.',
  4: 'No se pudo cargar el medio, ya sea porque el servidor o la red fallaron o porque el formato no es compatible.',
  5: "Los medios están cifrados y no tenemos las claves para descifrarlos".
};

// Agregar tipos como propiedades en MediaError
// por ejemplo, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
for (sea errNum = 0; errNum < MediaError.errorTypes.longitud; errNum++) {
  MediaError[MediaError.errorTypes[errNum]] = errNum;
  // los valores deben ser accesibles tanto en la clase como en la instancia
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
}

// jsdocs para instancias/miembros estáticos agregados arriba
// los métodos de instancia usan `#` y los métodos estáticos usan `.`
/**
 * Código de error W3C para cualquier error personalizado.
 *
 * @member MediaError#MEDIA_ERR_CUSTOM
 * @constante {número}
 * @predeterminado 0
 * /
/**
 * Código de error W3C para cualquier error personalizado.
 *
 * @miembro MediaError.MEDIA_ERR_CUSTOM
 * @constante {número}
 * @predeterminado 0
 * /

/**
 * Código de error W3C para error de medios abortado.
 *
 * @member MediaError#MEDIA_ERR_ABORTED
 * @constante {número}
 * @predeterminado 1
 * /
/**
 * Código de error W3C para error de medios abortado.
 *
 * @miembro MediaError.MEDIA_ERR_ABORTED
 * @constante {número}
 * @predeterminado 1
 * /

/**
 * Código de error W3C para cualquier error de red.
 *
 * @miembro MediaError#MEDIA_ERR_NETWORK
 * @constante {número}
 * @predeterminado 2
 * /
/**
 * Código de error W3C para cualquier error de red.
 *
 * @miembro MediaError.MEDIA_ERR_NETWORK
 * @constante {número}
 * @predeterminado 2
 * /

/**
 * Código de error W3C para cualquier error de decodificación.
 *
 * @miembro MediaError#MEDIA_ERR_DECODE
 * @constante {número}
 * @predeterminado 3
 * /
/**
 * Código de error W3C para cualquier error de decodificación.
 *
 * @miembro MediaError.MEDIA_ERR_DECODE
 * @constante {número}
 * @predeterminado 3
 * /

/**
 * Código de error W3C para cualquier momento en que una fuente no sea compatible.
 *
 * @member MediaError#MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constante {número}
 * @predeterminado 4
 * /
/**
 * Código de error W3C para cualquier momento en que una fuente no sea compatible.
 *
 * @miembro MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constante {número}
 * @predeterminado 4
 * /

/**
 * Código de error W3C para cualquier momento en que una fuente esté encriptada.
 *
 * @member MediaError#MEDIA_ERR_ENCRYPTED
 * @constante {número}
 * @predeterminado 5
 * /
/**
 * Código de error W3C para cualquier momento en que una fuente esté encriptada.
 *
 * @miembro MediaError.MEDIA_ERR_ENCRYPTED
 * @constante {número}
 * @predeterminado 5
 * /

exportar MediaError predeterminado;