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

import { UserVerificationContext } from './UserVerificationContext';
import { Authenticator } from '../../localData/Authenticator';
import { PasswordAuthenticatorProtectionStatus } from '../password/PasswordAuthenticatorProtectionStatus';

/**
 * The object providing information about the password user verification
 * (i.e. the user credential validation) operation to be done.
 *
 * This object contains the information required to ask the user to authenticate:
 * the authenticator to be used, whether there were previous errors authenticating, etc.
 *
 * @group User Interaction
 * @category Password
 * @see {@link PasswordUserVerifier.verifyPassword}
 */
export abstract class PasswordUserVerificationContext extends UserVerificationContext {
	/**
	 * The authenticator protection status.
	 */
	abstract authenticatorProtectionStatus: PasswordAuthenticatorProtectionStatus;

	/**
	 * Alternate constructor that creates a {@link UserVerificationContext} from a json.
	 *
	 * @param json contains the source for instance creation.
	 * @returns the created {@link PasswordUserVerificationContext} instance.
	 */
	static fromJson(json: any): PasswordUserVerificationContext {
		return PasswordUserVerificationContextImpl.fromJson(json);
	}
}

export class PasswordUserVerificationContextImpl extends PasswordUserVerificationContext {
	authenticator: Authenticator;
	authenticatorProtectionStatus: PasswordAuthenticatorProtectionStatus;

	constructor(
		authenticator: Authenticator,
		authenticatorProtectionStatus: PasswordAuthenticatorProtectionStatus
	) {
		super();
		this.authenticator = authenticator;
		this.authenticatorProtectionStatus = authenticatorProtectionStatus;
	}

	static fromJson(json: any): PasswordUserVerificationContextImpl {
		const authenticator = Authenticator.fromJson(json.authenticator);
		const status = PasswordAuthenticatorProtectionStatus.fromJson(
			json.authenticatorProtectionStatus
		);
		return new PasswordUserVerificationContextImpl(authenticator, status);
	}
}
