/**
 * Paypal Server SDKLib
 *
 * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
 */

import { lazy, object, optional, Schema } from '../schema';
import {
  ApplePayPaymentObject,
  applePayPaymentObjectSchema,
} from './applePayPaymentObject';
import {
  BancontactPaymentObject,
  bancontactPaymentObjectSchema,
} from './bancontactPaymentObject';
import {
  BLIKPaymentObject,
  bLIKPaymentObjectSchema,
} from './bLIKPaymentObject';
import { CardResponse, cardResponseSchema } from './cardResponse';
import { EPSPaymentObject, ePSPaymentObjectSchema } from './ePSPaymentObject';
import {
  GiropayPaymentObject,
  giropayPaymentObjectSchema,
} from './giropayPaymentObject';
import {
  GooglePayWalletResponse,
  googlePayWalletResponseSchema,
} from './googlePayWalletResponse';
import {
  IDEALPaymentObject,
  iDEALPaymentObjectSchema,
} from './iDEALPaymentObject';
import {
  MyBankPaymentObject,
  myBankPaymentObjectSchema,
} from './myBankPaymentObject';
import { P24PaymentObject, p24PaymentObjectSchema } from './p24PaymentObject';
import {
  PayPalWalletResponse,
  payPalWalletResponseSchema,
} from './payPalWalletResponse';
import {
  SofortPaymentObject,
  sofortPaymentObjectSchema,
} from './sofortPaymentObject';
import {
  TrustlyPaymentObject,
  trustlyPaymentObjectSchema,
} from './trustlyPaymentObject';
import {
  VenmoWalletResponse,
  venmoWalletResponseSchema,
} from './venmoWalletResponse';

/** The payment source used to fund the payment. */
export interface PaymentSourceResponse {
  /** The payment card to use to fund a payment. Card can be a credit or debit card. */
  card?: CardResponse;
  /** The PayPal Wallet response. */
  paypal?: PayPalWalletResponse;
  /** Information used to pay Bancontact. */
  bancontact?: BancontactPaymentObject;
  /** Information used to pay using BLIK. */
  blik?: BLIKPaymentObject;
  /** Information used to pay using eps. */
  eps?: EPSPaymentObject;
  /** Information needed to pay using giropay. */
  giropay?: GiropayPaymentObject;
  /** Information used to pay using iDEAL. */
  ideal?: IDEALPaymentObject;
  /** Information used to pay using MyBank. */
  mybank?: MyBankPaymentObject;
  /** Information used to pay using P24(Przelewy24). */
  p24?: P24PaymentObject;
  /** Information used to pay using Sofort. */
  sofort?: SofortPaymentObject;
  /** Information needed to pay using Trustly. */
  trustly?: TrustlyPaymentObject;
  /** Information needed to pay using ApplePay. */
  applePay?: ApplePayPaymentObject;
  /** Google Pay Wallet payment data. */
  googlePay?: GooglePayWalletResponse;
  /** Venmo wallet response. */
  venmo?: VenmoWalletResponse;
}

export const paymentSourceResponseSchema: Schema<PaymentSourceResponse> = object(
  {
    card: ['card', optional(lazy(() => cardResponseSchema))],
    paypal: ['paypal', optional(lazy(() => payPalWalletResponseSchema))],
    bancontact: [
      'bancontact',
      optional(lazy(() => bancontactPaymentObjectSchema)),
    ],
    blik: ['blik', optional(lazy(() => bLIKPaymentObjectSchema))],
    eps: ['eps', optional(lazy(() => ePSPaymentObjectSchema))],
    giropay: ['giropay', optional(lazy(() => giropayPaymentObjectSchema))],
    ideal: ['ideal', optional(lazy(() => iDEALPaymentObjectSchema))],
    mybank: ['mybank', optional(lazy(() => myBankPaymentObjectSchema))],
    p24: ['p24', optional(lazy(() => p24PaymentObjectSchema))],
    sofort: ['sofort', optional(lazy(() => sofortPaymentObjectSchema))],
    trustly: ['trustly', optional(lazy(() => trustlyPaymentObjectSchema))],
    applePay: ['apple_pay', optional(lazy(() => applePayPaymentObjectSchema))],
    googlePay: [
      'google_pay',
      optional(lazy(() => googlePayWalletResponseSchema)),
    ],
    venmo: ['venmo', optional(lazy(() => venmoWalletResponseSchema))],
  }
);
