/**
 * Account information PNZ-API-CentreLib
 *
 * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
 */

import { array, lazy, object, optional, Schema, string } from '../schema';
import { Amount, amountSchema } from './amount';
import { Balance1, balance1Schema } from './balance1';
import {
  BankTransactionCode,
  bankTransactionCodeSchema,
} from './bankTransactionCode';
import { CardInstrument, cardInstrumentSchema } from './cardInstrument';
import { CreditorAccount1, creditorAccount1Schema } from './creditorAccount1';
import { CreditorAgent1, creditorAgent1Schema } from './creditorAgent1';
import { DebtorAccount, debtorAccountSchema } from './debtorAccount';
import { DebtorAgent, debtorAgentSchema } from './debtorAgent';
import { MerchantDetails, merchantDetailsSchema } from './merchantDetails';
import {
  ProprietaryBankTransactionCode,
  proprietaryBankTransactionCodeSchema,
} from './proprietaryBankTransactionCode';
import {
  TransactionReference,
  transactionReferenceSchema,
} from './transactionReference';

export interface Transaction {
  accountId: string;
  amount: Amount;
  creditDebitIndicator: string;
  bookingDateTime: string;
  status: string;
  statementReference: string[];
  transactionReference: TransactionReference;
  transactionId: string;
  bankTransactionCode: BankTransactionCode;
  proprietaryBankTransactionCode: ProprietaryBankTransactionCode;
  valueDateTime: string;
  transactionInformation: string;
  balance: Balance1;
  merchantDetails: MerchantDetails;
  creditorAgent: CreditorAgent1;
  creditorAccount: CreditorAccount1;
  debtorAgent: DebtorAgent;
  debtorAccount: DebtorAccount;
  cardInstrument?: CardInstrument;
}

export const transactionSchema: Schema<Transaction> = object({
  accountId: ['AccountId', string()],
  amount: ['Amount', lazy(() => amountSchema)],
  creditDebitIndicator: ['CreditDebitIndicator', string()],
  bookingDateTime: ['BookingDateTime', string()],
  status: ['Status', string()],
  statementReference: ['StatementReference', array(string())],
  transactionReference: [
    'TransactionReference',
    lazy(() => transactionReferenceSchema),
  ],
  transactionId: ['TransactionId', string()],
  bankTransactionCode: [
    'BankTransactionCode',
    lazy(() => bankTransactionCodeSchema),
  ],
  proprietaryBankTransactionCode: [
    'ProprietaryBankTransactionCode',
    lazy(() => proprietaryBankTransactionCodeSchema),
  ],
  valueDateTime: ['ValueDateTime', string()],
  transactionInformation: ['TransactionInformation', string()],
  balance: ['Balance', lazy(() => balance1Schema)],
  merchantDetails: ['MerchantDetails', lazy(() => merchantDetailsSchema)],
  creditorAgent: ['CreditorAgent', lazy(() => creditorAgent1Schema)],
  creditorAccount: ['CreditorAccount', lazy(() => creditorAccount1Schema)],
  debtorAgent: ['DebtorAgent', lazy(() => debtorAgentSchema)],
  debtorAccount: ['DebtorAccount', lazy(() => debtorAccountSchema)],
  cardInstrument: [
    'CardInstrument',
    optional(lazy(() => cardInstrumentSchema)),
  ],
});
