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

import uuid from 'react-native-uuid';

import { AndroidMetaData } from './AndroidMetaData';
import { IosMetaData } from './IosMetaData';
import NevisMobileAuthenticationSdkReact from '../MobileAuthenticationSdk';
import { MetaDataInMessage } from '../model/messages/in/MetaDataInMessage';
import { OperationIdMessage } from '../model/messages/out/OperationIdMessage';

/**
 * The object containing information about the Nevis Mobile Authentication SDK.
 *
 * Usage example:
 * ```ts
 *  import { Platform } from 'react-native';
 *
 *  async function getSdkVersion(): Promise<string> {
 *      return Platform.select({
 *          android: async () => {
 *              const metaData = await MetaData.androidMetaData();
 *              return formatted(metaData?.mobileAuthenticationVersion);
 *          },
 *          ios: async () => {
 *              const metaData = await MetaData.iosMetaData();
 *              return formatted(metaData?.mobileAuthenticationVersion);
 *          },
 *          default: () => {
 *              return Promise.any('Unknown');
 *          },
 *      })();
 *  }
 *
 *  function formatted(version?: Version): string {
 *      if (version === undefined) {
 *          return 'Unknown';
 *      }
 *      return `${version.major}.${version.minor}.${version.patch}.${version.buildNumber}`;
 *  }
 * ```
 *
 * @group Essentials
 */
export abstract class MetaData {
	/**
	 * The object containing information about Nevis Mobile Authentication SDK for Android.
	 */
	static async androidMetaData(): Promise<AndroidMetaData | undefined> {
		const operationId = uuid.v4();
		const message = new OperationIdMessage(operationId);
		return NevisMobileAuthenticationSdkReact.metaData(message).then((json: any) => {
			const resultMessage = MetaDataInMessage.fromJson(json);
			return resultMessage.androidMetaData;
		});
	}

	/**
	 * The object containing information about Nevis Mobile Authentication SDK for iOS.
	 */
	static async iosMetaData(): Promise<IosMetaData | undefined> {
		const operationId = uuid.v4();
		const message = new OperationIdMessage(operationId);
		return NevisMobileAuthenticationSdkReact.metaData(message).then((json: any) => {
			const resultMessage = MetaDataInMessage.fromJson(json);
			return resultMessage.iosMetaData;
		});
	}
}
