import { NativeModules, Platform } from 'react-native';
import TamaraCheckoutURL from './TamaraCheckoutURL';

const LINKING_ERROR =
  `The package 'react-native-tamara-sdk' 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 TamaraSdk = NativeModules.TamaraSdk
  ? NativeModules.TamaraSdk
  : new Proxy(
    {},
    {
      get() {
        throw new Error(LINKING_ERROR);
      },
    }
  );

export function initSdk(authToken: string, apiUrl: string, notificationWebHook: string, publishKey: string, notificationToken: string, isSandbox: boolean): Promise<void> {
  return TamaraSdk.initSdk(authToken, apiUrl, notificationWebHook, publishKey, notificationToken, isSandbox);
}

export function startPayment(checkoutUrl: string, successCallbackUrl: string, failureCallbackUrl: string, cancelCallbackUrl: string): Promise<void> {
  return TamaraSdk.startPayment(checkoutUrl, successCallbackUrl, failureCallbackUrl, cancelCallbackUrl);
}

export function orderDetail(oderId: string): Promise<string> {
  return TamaraSdk.orderDetail(oderId);
}

export function capturePayment(jsonData: string): Promise<void> {
  return TamaraSdk.capturePayment(jsonData);
}

export function createOrder(orderReferenceId: string, description: string): Promise<void> {
  return TamaraSdk.createOrder(orderReferenceId, description);
}

export function setCountry(countryCode: string, currency: string): Promise<void> {
  return TamaraSdk.setCountry(countryCode, currency);
}

export function setPaymentType(paymentType: string): Promise<void> {
  return TamaraSdk.setPaymentType(paymentType);
}

export function setInstalments(instalments: number): Promise<void> {
  return TamaraSdk.setInstalments(instalments);
}

export function setPlatform(platform: string): Promise<void> {
  return TamaraSdk.setPlatform(platform);
}

export function setLocale(locale: string): Promise<void> {
  return TamaraSdk.setLocale(locale);
}

export function setOrderNumber(orderNumber: string): Promise<void> {
  return TamaraSdk.setOrderNumber(orderNumber);
}

export function setExpiresInMinutes(expiresInMinutes: number): Promise<void> {
  return TamaraSdk.setExpiresInMinutes(expiresInMinutes);
}

export function setRiskAssessment(jsonData: string): Promise<Boolean> {
  return TamaraSdk.setRiskAssessment(jsonData);
}

export function setAdditionalData(jsonData: string): Promise<void> {
  return TamaraSdk.setAdditionalData(jsonData);
}

export function addCustomFieldsAdditionalData(jsonData: string): Promise<void> {
  return TamaraSdk.addCustomFieldsAdditionalData(jsonData);
}

export function setCustomerInfo(
  firstName: string,
  lastName: string,
  phoneNumber: string,
  email: string,
  isFirstOrder: boolean
): Promise<void> {
  return TamaraSdk.setCustomerInfo(firstName, lastName, phoneNumber, email, isFirstOrder);
}

export function addItem(
  name: string,
  referenceId: string,
  sku: string,
  type: string,
  unitPrice: number,
  tax: number,
  discount: number,
  quantity: number
): Promise<void> {
  return TamaraSdk.addItem(name, referenceId, sku, type, unitPrice, tax, discount, quantity);
}

export function setShippingAddress(
  firstName: string,
  lastName: string,
  phoneNumber: string,
  addressLine1: string,
  addressLine2: string,
  country: string,
  region: string,
  city: string
): Promise<void> {
  return TamaraSdk.setShippingAddress(firstName, lastName, phoneNumber, addressLine1, addressLine2, country, region, city);
}

export function setBillingAddress(
  firstName: string,
  lastName: string,
  phoneNumber: string,
  addressLine1: string,
  addressLine2: string,
  country: string,
  region: string,
  city: string
): Promise<void> {
  return TamaraSdk.setBillingAddress(firstName, lastName, phoneNumber, addressLine1, addressLine2, country, region, city);
}

export function setCurrency(newCurrency: string): Promise<void> {
  return TamaraSdk.setCurrency(newCurrency);
}

export function setShippingAmount(amount: number): Promise<void> {
  return TamaraSdk.setShippingAmount(amount);
}

export function setDiscount(amount: number, name: string): Promise<void> {
  return TamaraSdk.setDiscount(amount, name);
}

export function paymentOrder(): Promise<void> {
  return TamaraSdk.paymentOrder();
}

export function refunds(orderId: string, jsonData: string): Promise<void> {
  return TamaraSdk.refunds(orderId, jsonData);
}

export function cancelOrder(orderId: string, jsonData: string): Promise<void> {
  return TamaraSdk.cancelOrder(orderId, jsonData);
}

export function updateOrderReference(orderId: string, orderReferenceId: string): Promise<void> {
  return TamaraSdk.updateOrderReference(orderId, orderReferenceId);
}

export function renderCartPage(language: string, country: string, publicKey: string, amount: number): Promise<void> {
  return TamaraSdk.renderCartPage(language, country, publicKey, amount);
}

export function renderProduct(language: string, country: string, publicKey: string, amount: number): Promise<void> {
  return TamaraSdk.renderProduct(language, country, publicKey, amount);
}

export function authoriseOrder(orderId: string): Promise<void> {
  return TamaraSdk.authoriseOrder(orderId);
}

export function clearItem(): Promise<void> {
  return TamaraSdk.clearItem();
}

export function checkPaymentOptions(jsonData: string): Promise<void> {
  return TamaraSdk.checkPaymentOptions(jsonData);
}

export { TamaraCheckoutURL };