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

import { AndroidMetaData } from '../../../metaData/AndroidMetaData';
import { IosMetaData } from '../../../metaData/IosMetaData';
import { ChannelMessage } from '../ChannelMessage';

/**
 * Holds the parameters of the metaData native event.
 */
export class MetaDataInMessage extends ChannelMessage {
	/**
	 * The identifier of the operation.
	 */
	operationId: string;

	/**
	 * The object containing information about Nevis Mobile Authentication SDK for Android.
	 */
	androidMetaData: AndroidMetaData | undefined;

	/**
	 * The object containing information about Nevis Mobile Authentication SDK for iOS.
	 */
	iosMetaData: IosMetaData | undefined;

	/**
	 * Default constructor for {@link MetaDataInMessage}.
	 *
	 * @param operationId the identifier of the operation.
	 * @param androidMetaData the object containing information about Nevis Mobile Authentication SDK for Android.
	 * @param iosMetaData the object containing information about Nevis Mobile Authentication SDK for iOS.
	 */
	private constructor(
		operationId: string,
		androidMetaData: AndroidMetaData | undefined,
		iosMetaData: IosMetaData | undefined
	) {
		super();
		this.operationId = operationId;
		this.androidMetaData = androidMetaData;
		this.iosMetaData = iosMetaData;
	}

	/**
	 * Alternate constructor that creates a {@link MetaDataInMessage} from a json.
	 *
	 * @param json contains the source for instance creation.
	 * @returns the created instance.
	 */
	static fromJson(json: any): MetaDataInMessage {
		const operationId = json.operationId;
		const androidMetaData: AndroidMetaData =
			json.androidMetaData && AndroidMetaData.fromJson(json.androidMetaData);
		const iosMetaData: IosMetaData = json.iosMetaData && IosMetaData.fromJson(json.iosMetaData);

		return new MetaDataInMessage(operationId, androidMetaData, iosMetaData);
	}
}
