/**
 * Copyright © 2024 Nevis Security AG. All rights reserved.
 */

import { DeviceInformationSyncClockSkewTooBigError } from './DeviceInformationSyncClockSkewTooBigError';
import { DeviceInformationSyncDeviceProtectionError } from './DeviceInformationSyncDeviceProtectionError';
import type { DeviceInformationSyncError } from './DeviceInformationSyncError';
import { DeviceInformationSyncNetworkError } from './DeviceInformationSyncNetworkError';
import { DeviceInformationSyncNoDeviceLockError } from './DeviceInformationSyncNoDeviceLockError';
import { DeviceInformationSyncOperationNotSupportedByBackendError } from './DeviceInformationSyncOperationNotSupportedByBackendError';
import { DeviceInformationSyncUnknownError } from './DeviceInformationSyncUnknownError';
import { ErrorConverter } from '../../ErrorConverter';

enum DeviceInformationSyncErrorType {
	ClockSkewTooBig,
	DeviceProtectionError,
	NetworkError,
	NoDeviceLockError,
	OperationNotSupportedByBackend,
	Unknown,
}

export class DeviceInformationSyncErrorConverter extends ErrorConverter<DeviceInformationSyncError> {
	convert(): DeviceInformationSyncError {
		const subtype =
			DeviceInformationSyncErrorType[
				this.error.type as keyof typeof DeviceInformationSyncErrorType
			];
		switch (subtype) {
			case DeviceInformationSyncErrorType.ClockSkewTooBig:
				if (this.error.server) {
					return new DeviceInformationSyncClockSkewTooBigError(
						this.error.server,
						this.error.description,
						this.error.cause
					);
				}

				return new DeviceInformationSyncUnknownError(
					this.error.description,
					this.error.cause
				);
			case DeviceInformationSyncErrorType.DeviceProtectionError:
				return new DeviceInformationSyncDeviceProtectionError(
					this.error.description,
					this.error.cause
				);
			case DeviceInformationSyncErrorType.NetworkError:
				if (this.error.server) {
					return new DeviceInformationSyncNetworkError(
						this.error.server,
						this.error.description,
						this.error.cause
					);
				}

				return new DeviceInformationSyncUnknownError(
					this.error.description,
					this.error.cause
				);
			case DeviceInformationSyncErrorType.NoDeviceLockError:
				return new DeviceInformationSyncNoDeviceLockError(
					this.error.description,
					this.error.cause
				);
			case DeviceInformationSyncErrorType.OperationNotSupportedByBackend:
				if (this.error.server) {
					return new DeviceInformationSyncOperationNotSupportedByBackendError(
						this.error.server,
						this.error.description,
						this.error.cause
					);
				}

				return new DeviceInformationSyncUnknownError(
					this.error.description,
					this.error.cause
				);
			case DeviceInformationSyncErrorType.Unknown:
				return new DeviceInformationSyncUnknownError(
					this.error.description,
					this.error.cause,
					this.error.server
				);
		}
	}
}
