// Copyright © 2022 Olo Inc. All rights reserved.
// This software is made available under the Olo Pay SDK License (See LICENSE.md file)
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
import useOloPayNativeModule from './hooks/useOloPayNativeModule';

import { version, buildType } from '../package.json';

import type {
  DigitalWalletConfig,
  DigitalWalletPaymentMethodResult,
  DigitalWalletPaymentRequestOptions,
  DigitalWalletStatus,
  InitializationStatus,
  IOloPaySDK,
} from './definitions';

const OlopaysdkReactNative = useOloPayNativeModule();

export * from './definitions';
export * from './components/PaymentCardDetailsView';
export * from './components/PaymentCardDetailsForm';
export * from './components/PaymentCardCvvView';
export * from './components/DigitalWalletButton';

export const OloPayEvents = new NativeEventEmitter(
  NativeModules.OlopaysdkReactNativeEventEmitter
);

export const OloPaySDK: IOloPaySDK = {
  initialize: async function (
    productionEnvironment: boolean,
    digitalWalletConfig?: DigitalWalletConfig
  ): Promise<void> {
    await OlopaysdkReactNative.initializeMetadata({ version, buildType });
    await OlopaysdkReactNative.initializeOloPay({ productionEnvironment });
    if (
      (Platform.OS === 'android' && digitalWalletConfig?.initializeGooglePay) ||
      (Platform.OS === 'ios' && digitalWalletConfig?.initializeApplePay)
    ) {
      await OlopaysdkReactNative.updateDigitalWalletConfig({
        digitalWalletConfig,
      });
    }
    return;
  },
  updateDigitalWalletConfig: async function (
    digitalWalletConfig: DigitalWalletConfig
  ): Promise<void> {
    if (
      (Platform.OS === 'android' && digitalWalletConfig?.initializeGooglePay) ||
      (Platform.OS === 'ios' && digitalWalletConfig?.initializeApplePay)
    ) {
      await OlopaysdkReactNative.updateDigitalWalletConfig({
        digitalWalletConfig,
      });
    }
  },
  isDigitalWalletReady: async function (): Promise<DigitalWalletStatus> {
    return (await OlopaysdkReactNative.isDigitalWalletReady()) as DigitalWalletStatus;
  },
  createDigitalWalletPaymentMethod: async function (
    options: DigitalWalletPaymentRequestOptions
  ): Promise<DigitalWalletPaymentMethodResult> {
    return (await OlopaysdkReactNative.getDigitalWalletPaymentMethod(
      options
    )) as DigitalWalletPaymentMethodResult;
  },
  isInitialized: async function (): Promise<InitializationStatus> {
    return (await OlopaysdkReactNative.isOloPayInitialized()) as InitializationStatus;
  },
  isDigitalWalletInitialized: async function (): Promise<InitializationStatus> {
    return (await OlopaysdkReactNative.isDigitalWalletInitialized()) as InitializationStatus;
  },
};
