/**
 * SendbirdError, platform-specific errors are marked as @platform
 *
 * @class SendbirdError
 * @since 1.0.0
 */
export class SendbirdError extends Error {
  static readonly ErrorCode = {
    // Call
    DIAL_CANCELED: 1800100,
    MY_USER_ID_NOT_ALLOWED: 1800101,

    // Client
    ERR_REQUEST_FAILED: 1800200,
    ERR_WEBSOCKET_CONNECTION_NOT_OPENED: 1800201,
    ERR_WEBSOCKET_CONNECTION_FAILED: 1800202,
    ERR_NO_RESPONSE_DUE_TO_TIMEOUT: 1800203,
    ERR_REQUEST_FAILED_DUE_TO_WEBSOCKET_CONNECTION_LOST: 1800204,
    ERR_WRONG_RESPONSE: 1800205,
    ERR_QUERY_IN_PROGRESS: 1800206,
    INTERNAL_SERVER_ERROR: 1800207,
    ERR_MALFORMED_DATA: 1800208,

    // Room
    ERR_PARTICIPANT_ALREADY_IN_ROOM: 1800700,
    ERR_ENTERING_ROOM_STILL_IN_PROGRESS: 1800701,
    ERR_PARTICIPANT_NOT_IN_ROOM: 1800702,
    ERR_EXITING_ROOM_STILL_IN_PROGRESS: 1800703,
    ERR_FAILED_TO_ESTABLISH_CONNECTION_TO_SEND_STREAM: 1800704,
    ERR_FAILED_TO_ESTABLISH_CONNECTION_TO_RECEIVE_STREAM: 1800705,
    ERR_LOCAL_PARTICIPANT_LOST_CONNECTION: 1800706,

    // General
    INVALID_PARAMETER_VALUE: 1800300,
    INVALID_PARAMETER_TYPE: 1800301,
    INSTANCE_NOT_INITIALIZED: 1800302,
    USER_NOT_AUTHENTICATED: 1800303,

    // Device
    CAMERA_ALREADY_SWITCHING: 1800400,
    ERR_CAMERA_SWITCH: 1800401,
    ERR_CHANGING_AUDIO_DEVICE: 1800402,

    // Take SnapShot Error
    ERR_CAPTURE_NOT_ALLOWED_ON_AUDIO_CALL: 1800600,
    ERR_VIDEO_VIEW_NOT_READY: 1800601,
    ERR_VIDEO_CALL_NOT_CONNECTED_YET: 1800602,
    ERR_FAILED_TO_GET_IMAGE_FROM_VIDEO_STREAM: 1800603,

    // Server
    ERR_SERVER_INTERNAL_ERROR: 1400999,
    ERR_INVALID_CALL_STATUS: 1400101,
    ERR_CALL_DOES_NOT_EXIST: 1400102,
    ERR_CALLEE_DOES_NOT_EXIST: 1400103,
    ERR_DIAL_MYSELF: 1400104,
    ERR_NO_PERMISSION: 1400105,
    ERR_CALLEE_NEVER_AUTHENTICATE: 1400106,
    ERR_ROOM_MAX_PARTICIPANTS: 1400120,
    ERR_INVALID_ROOM_PARTICIPANT: 1400121,
    ERR_CLIENT_ALREADY_ENTERED: 1400122,
    ERR_SEND_ENDPOINT_CANNOT_ATTACH: 1400123,
    ERR_PARTICIPANT_ALREADY_HAS_SEND_ENDPOINT: 1400124,
    ERR_ROOM_DELETED: 1400126,

    // Recording
    ERR_CALL_NOT_CONNECTED_YET: 1800610,
    ERR_WRONG_RECORDING_TYPE_FOR_AUDIO_CALL: 1800611,
    ERR_RECORDING_ALREADY_IN_PROGRESS: 1800612,
    ERR_FAILED_TO_OPEN_FILE: 1800613,
    ERR_FAILED_TO_START_RECORDING: 1800614,
    ERR_FAILED_TO_STOP_RECORDING: 1800615,
    /** @platform Web **/
    ERR_NOT_SUPPORTED_BROWSER_FOR_RECORDING: 1800616,
    ERR_INVALID_RECORDING_TYPE: 1800617,
    /** @platform Android **/
    ERR_NOT_SUPPORTED_OS_VERSION_FOR_RECORDING: 1800618,

    // screen share
    ERR_SCREEN_SHARE_RESTRICTED_FROM_AUDIO_CALL: 1800620,
    ERR_SCREEN_SHARE_REQUEST_BEFORE_CALL_IS_CONNECTED: 1800621,
    ERR_SCREEN_SHARE_ALREADY_IN_PROGRESS: 1800622,
    ERR_NO_SCREEN_SHARE_EXISTS: 1800623,
    /** @platform Android **/
    ERR_NOT_SUPPORTED_OS_VERSION_FOR_SCREEN_SHARE: 1800624,
    /** @platform Web **/
    ERR_NOT_SUPPORTED_BROWSER_FOR_SCREEN_SHARE: 1800625,
    ERR_SCREEN_SHARE_FAILED_DUE_TO_UNKNOWN_REASON: 1800626,
    ERR_NOT_SUPPORTED_APP_STATE_FOR_SCREEN_SHARE: 1800627,
    ERR_PERMISSION_DENIED_FOR_SCREEN_SHARE: 1800628,
    ERR_SELECTED_CONTENT_NOT_EXIST: 1800629,
    ERR_SELECTED_CONTENT_INACCESSIBLE: 1800630,
    ERR_MEDIA_STREAM_NOT_ALLOWED_ON_HOLD: 1800631,

    // hold and resume
    ERR_CALL_ALREADY_ON_HOLD: 1800801,
    ERR_ACTIVE_CALL_IN_PROGRESS: 1800802,
    ERR_ANOTHER_CALL_IN_PROGRESS: 1800803,
  } as const;

  public readonly name = 'SendbirdError';

  private readonly _code: number;

  constructor(message: string, code: number | string) {
    super(message);

    if (typeof code === 'string') {
      this._code = parseInt(code, 10);
    } else {
      this._code = code;
    }
  }

  public get code() {
    return this._code;
  }
}
