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

import { PasswordChangeRecoverableCustomValidationError } from './PasswordChangeRecoverableCustomValidationError';
import type { PasswordChangeRecoverableError } from './PasswordChangeRecoverableError';
import { PasswordChangeRecoverableInvalidPassword } from './PasswordChangeRecoverableInvalidPassword';
import { PasswordChangeRecoverableOldPasswordEqualsNewPassword } from './PasswordChangeRecoverableOldPasswordEqualsNewPassword';
import { ErrorConverter } from '../../ErrorConverter';

enum PasswordChangeRecoverableErrorType {
	CustomValidationError,
	InvalidPassword,
	OldPasswordEqualsNewPassword,
}

export class PasswordChangeRecoverableErrorConverter extends ErrorConverter<PasswordChangeRecoverableError> {
	convert(): PasswordChangeRecoverableError {
		const subtype =
			PasswordChangeRecoverableErrorType[
				this.error.type as keyof typeof PasswordChangeRecoverableErrorType
			];
		switch (subtype) {
			case PasswordChangeRecoverableErrorType.CustomValidationError:
				return new PasswordChangeRecoverableCustomValidationError(
					this.error.description,
					this.error.cause
				);
			case PasswordChangeRecoverableErrorType.InvalidPassword:
				return new PasswordChangeRecoverableInvalidPassword(
					this.error.description,
					this.error.cause
				);
			case PasswordChangeRecoverableErrorType.OldPasswordEqualsNewPassword:
				return new PasswordChangeRecoverableOldPasswordEqualsNewPassword(
					this.error.description,
					this.error.cause
				);
		}
	}
}
