export interface ComponentData {
  scheme: {
    card_public_key: string;
  };
}

export interface PaymentDetails {
  amount: {
    value: number; //In Multiples of hundred
    currency: string;
  };
  reference: string;
  shopperReference: string;
  shopperEmail: string;
  channel: string;
  countryCode: string;
  shopperLocale: string;
  returnUrl: string;
  merchantAccount: string;
  additionalData: {
    allow3DS2: boolean;
    executeThreeD: boolean;
  };
}

export interface AdyenPaymentMethodDetail {
  key: string;
  type: string;
  optional?: boolean;
}

export interface CreditCard {
  details: AdyenPaymentMethodDetail[];
  name: string;
  type: "scheme" | "bcmc";
  logo: string;
}

export interface CreditCardData {
  paymentMethods: CreditCard[];
  storedPaymentMethods?: SavedPaymentMethod[];
}

export interface SavedPaymentMethod {
  type: "scheme" | "bcmc";
  id: string;
  name: string;
  brand: string;
  lastFour: string;
  expiryMonth: string;
  expiryYear: string;
  holderName: string;
  supportedShopperInteractions: string[];
}

export type CreditCardPaymentDetails =
  | NewCreditCardPaymentDetails
  | SavedCreditPaymentCardDetails;

export interface NewCreditCardPaymentDetails {
  storePaymentMethod: boolean;
  encryptedCardNumber: string;
  encryptedExpiryMonth: string;
  encryptedExpiryYear: string;
  encryptedSecurityCode: string;
  storedPaymentMethodId: undefined;
  type: string;
}

export interface SavedCreditPaymentCardDetails {
  storePaymentMethod: boolean;
  encryptedSecurityCode: string;
  storedPaymentMethodId: string;
  type: string;
}

export default class AdyenPayment {
  public static SCHEME;
  public static BCMC;
  public static pay: (
    scheme: AdyenPayment.SCHEME | AdyenPayment.BCMC,
    componentDate: ComponentData,
    paymentDetails: PaymentDetails,
    creditCardsData: CreditCardData,
    canSaveCreditCards: boolean
  ) => Promise<CreditCardPaymentDetails>;
}
