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

import { Version } from './Version';

/**
 * The object containing information about Nevis Mobile Authentication SDK for iOS.
 *
 * @group Essentials
 */
export abstract class IosMetaData {
	/**
	 * The current version of Nevis Mobile Authentication SDK for iOS.
	 */
	abstract mobileAuthenticationVersion: Version;

	/**
	 * The {@link https://docs.nevis.net/mobilesdk/guide/configuration#facet-id | facet ID} used by
	 * Nevis Mobile Authentication SDK for iOS.
	 *
	 * The facet ID of your application has to match the list of allowed facets stored provided by
	 * the facet service of the backend.
	 */
	abstract applicationFacetId: string;

	/**
	 * Default constructor for {@link IosMetaData}.
	 *
	 * @param mobileAuthenticationVersion the current version of Nevis Mobile Authentication SDK for iOS.
	 * @param applicationFacetId the facet ID used by Nevis Mobile Authentication SDK for iOS.
	 * @returns an {@link IosMetaData} instance.
	 */
	static create(mobileAuthenticationVersion: Version, applicationFacetId: string): IosMetaData {
		return new IOSMetaDataImpl(mobileAuthenticationVersion, applicationFacetId);
	}

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

export class IOSMetaDataImpl extends IosMetaData {
	mobileAuthenticationVersion: Version;
	applicationFacetId: string;

	constructor(mobileAuthenticationVersion: Version, applicationFacetId: string) {
		super();
		this.mobileAuthenticationVersion = mobileAuthenticationVersion;
		this.applicationFacetId = applicationFacetId;
	}

	static fromJson(json: any): IOSMetaDataImpl {
		const mobileAuthenticationVersion = Version.fromJson(json.mobileAuthenticationVersion);

		return new IOSMetaDataImpl(mobileAuthenticationVersion, json.applicationFacetId);
	}
}
