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

import { AndroidMetaData } from './AndroidMetaData';
import { IOSMetaData } from './IOSMetaData';

/**
 * The object containing information about the Nevis Mobile Authentication SDK.
 */
export abstract class MetaData {
	/**
	 * The object containing information about the native iOS SDK.
	 */
	abstract iosMetaData: IOSMetaData | undefined;

	/**
	 * The object containing information about the native Android SDK.
	 */
	abstract androidMetaData: AndroidMetaData | undefined;

	/**
	 * Default constructor for {@link MetaData}.
	 *
	 * @param iosMetaData the object containing information about the native iOS SDK.
	 * @param androidMetaData The object containing information about the native Android SDK.
	 * @returns a {@link MetaData} instance.
	 */
	static create(
		iosMetaData: IOSMetaData | undefined,
		androidMetaData: AndroidMetaData | undefined
	): MetaData {
		return new MetaDataImpl(iosMetaData, androidMetaData);
	}

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

export class MetaDataImpl extends MetaData {
	iosMetaData: IOSMetaData | undefined;
	androidMetaData: AndroidMetaData | undefined;

	constructor(
		iosMetaData: IOSMetaData | undefined,
		androidMetaData: AndroidMetaData | undefined
	) {
		super();
		this.iosMetaData = iosMetaData;
		this.androidMetaData = androidMetaData;
	}

	static fromJson(json: any): MetaDataImpl {
		const iosMetaData = json.iosMetaData && IOSMetaData.fromJson(json.iosMetaData);
		const androidMetaData =
			json.androidMetaData && AndroidMetaData.fromJson(json.androidMetaData);

		if (iosMetaData === undefined && androidMetaData === undefined) {
			throw new Error('Unknown MetaData; No iOS and Android metaData present');
		}

		return new MetaDataImpl(iosMetaData, androidMetaData);
	}
}
