/**
 * @file 미디어 오류.js
 */
import {assign, isObject} from './utils/obj';

/**
 * 표준 HTML5 `MediaError` 클래스를 모방한 사용자 정의 `MediaError` 클래스.
 *
 * @param {번호|문자열|객체|MediaError} 값
 * 이것은 여러 유형일 수 있습니다.
 * - 숫자: 표준 오류 코드여야 합니다.
 * - 문자열: 오류 메시지(코드는 0임)
 * - 개체: 임의 속성
 * - `MediaError`(네이티브): video.js `MediaError` 개체를 채우는 데 사용됩니다.
 * - `MediaError` (video.js): 이미
 * 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}
 *
 * @클래스 미디어 오류
 */
함수 MediaError(값) {

  // `instanceof`가 발생하지 않도록 이 생성자에 대한 중복 호출을 허용합니다.
  // 코드 주변을 확인합니다.
  if (MediaError의 값 인스턴스) {
    반환 값;
  }

  if (값 유형 === '숫자') {
    this.코드 = 값;
  } 그렇지 않으면 (값 유형 === '문자열') {
    // 기본 코드는 0이므로 사용자 지정 오류입니다.
    this.message = 값;
  } 그렇지 않으면 (isObject(값)) {

    // 네이티브 `MediaError` 개체 때문에 `code` 속성을 수동으로 할당합니다.
    // 개체의 소유/열거 가능한 속성으로 노출하지 마십시오.
    if (typeof value.code === '숫자') {
      this.code = 값.코드;
    }

    할당(이것, 값);
  }

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

/**
 * 정의된 `MediaError` 유형 중 두 가지를 나타내는 오류 코드
 *
 * @type {숫자}
 */
MediaError.prototype.code = 0;

/**
 * 오류와 함께 표시할 선택적 메시지입니다. 메시지가 HTML5의 일부가 아닙니다.
 * 비디오 사양이지만 보다 유익한 사용자 정의 오류를 허용합니다.
 *
 * @type {문자열}
 */
MediaError.prototype.message = '';

/**
 * 플러그인에 의해 설정될 수 있는 선택적 상태 코드는 더 자세한 정보를 허용합니다.
 * 오류. 예를 들어 플러그인은 특정 HTTP 상태 코드와
 * 해당 코드에 대한 오류 메시지. 그런 다음 플러그인이 해당 오류를 수신하면 이 클래스는
 * 오류 메시지를 표시하는 방법을 알고 있습니다. 이렇게 하면 맞춤 메시지를 표시할 수 있습니다.
 * `Player` 오류 오버레이에서 위로.
 *
 * @type {배열}
 */
MediaError.prototype.status = null;

/**
 * W3C 표준에 의해 인덱싱된 오류. 주문 **변경할 수 없습니다**! 참조
 * 자세한 내용은 {@link MediaError}에 나열된 사양입니다.
 *
 * @enum {배열}
 * @읽기전용
 * @property {string} 0 - MEDIA_ERR_CUSTOM
 * @property {string} 1 - MEDIA_ERR_ABORTED
 * @property {string} 2 - MEDIA_ERR_NETWORK
 * @property {문자열} 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',
  '미디어_ERR_네트워크',
  'MEDIA_ERR_DECODE',
  'MEDIA_ERR_SRC_NOT_SUPPORTED',
  'MEDIA_ERR_ENCRYPTED'
];

/**
 * {@link MediaError.errorTypes}에 기반한 기본 `MediaError` 메시지.
 *
 * @type {배열}
 * @끊임없는
 */
MediaError.defaultMessages = {
  1: '미디어 재생을 중단했습니다',
  2: '네트워크 오류로 인해 미디어 다운로드가 도중에 실패했습니다.',
  3: '손상 문제로 인해 또는 미디어가 브라우저에서 지원하지 않는 기능을 사용했기 때문에 미디어 재생이 중단되었습니다.',
  4: '서버나 네트워크가 실패했거나 형식이 지원되지 않기 때문에 미디어를 로드할 수 없습니다.',
  5: '미디어가 암호화되어 있으며 해독할 키가 없습니다.'
};

// MediaError에 유형을 속성으로 추가
// 예를 들어 MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
for (let errNum = 0; errNum < MediaError.errorTypes.length; 오류번호++) {
  MediaError[MediaError.errorTypes[errNum]] = errNum;
  // 값은 클래스와 인스턴스 모두에서 액세스할 수 있어야 합니다.
  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
}

// 위에 추가된 인스턴스/정적 멤버에 대한 jsdocs
// 인스턴스 메서드는 `#`을 사용하고 정적 메서드는 `.`를 사용합니다.
/**
 * 사용자 정의 오류에 대한 W3C 오류 코드.
 *
 * @member MediaError#MEDIA_ERR_CUSTOM
 * @constant {숫자}
 * @디폴트 0
 */
/**
 * 사용자 정의 오류에 대한 W3C 오류 코드.
 *
 * @member MediaError.MEDIA_ERR_CUSTOM
 * @constant {숫자}
 * @디폴트 0
 */

/**
 * 미디어 오류에 대한 W3C 오류 코드가 중단되었습니다.
 *
 * @member MediaError#MEDIA_ERR_ABORTED
 * @constant {숫자}
 * @디폴트 1
 */
/**
 * 미디어 오류에 대한 W3C 오류 코드가 중단되었습니다.
 *
 * @member MediaError.MEDIA_ERR_ABORTED
 * @constant {숫자}
 * @디폴트 1
 */

/**
 * 모든 네트워크 오류에 대한 W3C 오류 코드.
 *
 * @member MediaError#MEDIA_ERR_NETWORK
 * @constant {숫자}
 * @디폴트 2
 */
/**
 * 모든 네트워크 오류에 대한 W3C 오류 코드.
 *
 * @member MediaError.MEDIA_ERR_NETWORK
 * @constant {숫자}
 * @디폴트 2
 */

/**
 * 모든 디코딩 오류에 대한 W3C 오류 코드.
 *
 * @member MediaError#MEDIA_ERR_DECODE
 * @constant {숫자}
 * @디폴트 3
 */
/**
 * 모든 디코딩 오류에 대한 W3C 오류 코드.
 *
 * @member MediaError.MEDIA_ERR_DECODE
 * @constant {숫자}
 * @디폴트 3
 */

/**
 * 소스가 지원되지 않는 시간에 대한 W3C 오류 코드.
 *
 * @member MediaError#MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constant {숫자}
 * @디폴트 4
 */
/**
 * 소스가 지원되지 않는 시간에 대한 W3C 오류 코드.
 *
 * @member MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
 * @constant {숫자}
 * @디폴트 4
 */

/**
 * 소스가 암호화된 시간에 대한 W3C 오류 코드.
 *
 * @member MediaError#MEDIA_ERR_ENCRYPTED
 * @constant {숫자}
 * @디폴트 5
 */
/**
 * 소스가 암호화된 시간에 대한 W3C 오류 코드.
 *
 * @member MediaError.MEDIA_ERR_ENCRYPTED
 * @constant {숫자}
 * @디폴트 5
 */

수출 기본 MediaError;