import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
import type { ConfigType, InitiateKycParams, LoginParams } from './types';

const LINKING_ERROR =
  `The package 'react-native-onramp' doesn't seem to be linked. Make sure: \n\n` +
  Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
  '- You rebuilt the app after installing the package\n' +
  '- You are not using Expo Go\n';

const Onramp = NativeModules.OnrampSDK
  ? NativeModules.OnrampSDK
  : new Proxy(
      {},
      {
        get() {
          throw new Error(LINKING_ERROR);
        },
      }
    );

const isValidPhoneNumber = (phoneNumber: string): boolean => {
  const encodedRegex = /^%2[Bb]\d+-\d+$/;
  return encodedRegex.test(phoneNumber);
};

export const startOnrampSDK = (config: ConfigType) => {
  if (!config.appId) {
    throw new TypeError("'appId is missing or null.'");
  }
  if (config.phoneNumber && !isValidPhoneNumber(config.phoneNumber)) {
    if (
      typeof config.phoneNumber !== 'string' ||
      !isValidPhoneNumber(config.phoneNumber)
    ) {
      throw new TypeError(
        'Invalid phoneNumber format. Expected URL-encoded "+countryCode-phoneNumber" format; use encodeURIComponent to encode the phone number'
      );
    }
  }
  return Onramp.startSdk(config);
};

export const startOnrampLogin = (params: LoginParams) => {
  if (!params.appId) {
    throw new TypeError("'appId is missing or null.'");
  }

  return Onramp.startOnrampLogin(params);
};

export const initiateOnrampKyc = (params: InitiateKycParams) => {
  if (!params.appId) {
    throw new TypeError("'appId is missing or null.'");
  }
  if (!params.payload) {
    throw new TypeError("'payload is missing or null.'");
  }
  if (!params.signature) {
    throw new TypeError("'signature is missing or null.'");
  }
  if (!params.customerId) {
    throw new TypeError("'customerId is missing or null.'");
  }
  if (!params.apiKey) {
    throw new TypeError("'apiKey is missing or null.'");
  }

  return Onramp.initiateOnrampKyc(params);
};

export const closeOnrampSDK = () => {
  return Onramp.closeSdk();
};

export const onRampSDKNativeEvent = new NativeEventEmitter(
  NativeModules.OnrampSDK
);
