/* tslint:disable */
/* eslint-disable */
/**
 * Paystack
 * The OpenAPI specification of the Paystack API that merchants and developers can harness to build financial solutions in Africa.
 *
 * The version of the Paystack Node library: 1.0.0
 * Contact: techsupport@paystack.com
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


import { BaseAPI, RequiredError } from '../runtime';
import {
    Response,
    ResponseFromJSON
} from '../models';

export interface ChargeAuthorizationRequest {
    email: string;
    amount: number;
    authorization_code: string;
    reference?: string;
    currency?: string;
    metadata?: string;
    split_code?: string;
    subaccount?: string;
    transaction_charge?: string;
    bearer?: string;
    queue?: boolean;
}

export interface CheckAuthorizationRequest {
    email: string;
    amount: number;
    authorization_code?: string;
    currency?: string;
}

export interface DownloadRequest {
    perPage?: number;
    page?: number;
    from?: Date;
    to?: Date;
}

export interface EventRequest {
    id: string;
}

export interface FetchRequest {
    id: string;
}

export interface InitializeRequest {
    email: string;
    amount: number;
    currency?: string;
    reference?: string;
    callback_url?: string;
    plan?: string;
    invoice_limit?: number;
    metadata?: string;
    channels?: Array<string>;
    split_code?: string;
    subaccount?: string;
    transaction_charge?: string;
    bearer?: string;
}

export interface ListRequest {
    perPage?: number;
    page?: number;
    from?: Date;
    to?: Date;
}

export interface PartialDebitRequest {
    email: string;
    amount: number;
    authorization_code: string;
    currency: string;
    reference?: string;
    at_least?: string;
}

export interface SessionRequest {
    id: string;
}

export interface TimelineRequest {
    id_or_reference: string;
}

export interface TotalsRequest {
    perPage?: number;
    page?: number;
    from?: Date;
    to?: Date;
}

export interface VerifyRequest {
    reference: string;
}

/**
 * 
 */
export class Transaction extends BaseAPI {

    /**
     * Charge Authorization
     */
    async chargeAuthorization(requestParameters: ChargeAuthorizationRequest): Promise<Response> {
        if (requestParameters.email === null || requestParameters.email === undefined) {
            throw new RequiredError('email','Required parameter email was null or undefined when calling chargeAuthorization.');
        }
        if (requestParameters.amount === null || requestParameters.amount === undefined) {
            throw new RequiredError('amount','Required parameter amount was null or undefined when calling chargeAuthorization.');
        }
        if (requestParameters.authorization_code === null || requestParameters.authorization_code === undefined) {
            throw new RequiredError('authorization_code','Required parameter authorization_code was null or undefined when calling chargeAuthorization.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.email !== undefined) {
            formParams['email'] = requestParameters.email;
        }

        if (requestParameters.amount !== undefined) {
            formParams['amount'] = requestParameters.amount;
        }

        if (requestParameters.authorization_code !== undefined) {
            formParams['authorization_code'] = requestParameters.authorization_code;
        }

        if (requestParameters.reference !== undefined) {
            formParams['reference'] = requestParameters.reference;
        }

        if (requestParameters.currency !== undefined) {
            formParams['currency'] = requestParameters.currency;
        }

        if (requestParameters.metadata !== undefined) {
            formParams['metadata'] = requestParameters.metadata;
        }

        if (requestParameters.split_code !== undefined) {
            formParams['split_code'] = requestParameters.split_code;
        }

        if (requestParameters.subaccount !== undefined) {
            formParams['subaccount'] = requestParameters.subaccount;
        }

        if (requestParameters.transaction_charge !== undefined) {
            formParams['transaction_charge'] = requestParameters.transaction_charge;
        }

        if (requestParameters.bearer !== undefined) {
            formParams['bearer'] = requestParameters.bearer;
        }

        if (requestParameters.queue !== undefined) {
            formParams['queue'] = requestParameters.queue;
        }


        const response = await this.request({
            path: `/transaction/charge_authorization`,
            method: 'POST',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Check Authorization
     */
    async checkAuthorization(requestParameters: CheckAuthorizationRequest): Promise<Response> {
        if (requestParameters.email === null || requestParameters.email === undefined) {
            throw new RequiredError('email','Required parameter email was null or undefined when calling checkAuthorization.');
        }
        if (requestParameters.amount === null || requestParameters.amount === undefined) {
            throw new RequiredError('amount','Required parameter amount was null or undefined when calling checkAuthorization.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.email !== undefined) {
            formParams['email'] = requestParameters.email;
        }

        if (requestParameters.amount !== undefined) {
            formParams['amount'] = requestParameters.amount;
        }

        if (requestParameters.authorization_code !== undefined) {
            formParams['authorization_code'] = requestParameters.authorization_code;
        }

        if (requestParameters.currency !== undefined) {
            formParams['currency'] = requestParameters.currency;
        }


        const response = await this.request({
            path: `/transaction/check_authorization`,
            method: 'POST',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Export Transactions
     */
    async download(requestParameters: DownloadRequest): Promise<Response> {
        const queryParameters: any = {};

        if (requestParameters.perPage !== undefined) {
            queryParameters['perPage'] = requestParameters.perPage;
        }

        if (requestParameters.page !== undefined) {
            queryParameters['page'] = requestParameters.page;
        }

        if (requestParameters.from !== undefined) {
            queryParameters['from'] = (requestParameters.from as any).toISOString();
        }

        if (requestParameters.to !== undefined) {
            queryParameters['to'] = (requestParameters.to as any).toISOString();
        }


        const response = await this.request({
            path: `/transaction/export`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Get Transaction Event
     */
    async event(requestParameters: EventRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling event.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/transaction/{id}/event`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Fetch a transaction to get its details
     * Fetch Transaction
     */
    async fetch(requestParameters: FetchRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling fetch.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/transaction/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Create a new transaction
     * Initialize Transaction
     */
    async initialize(requestParameters: InitializeRequest): Promise<Response> {
        if (requestParameters.email === null || requestParameters.email === undefined) {
            throw new RequiredError('email','Required parameter email was null or undefined when calling initialize.');
        }
        if (requestParameters.amount === null || requestParameters.amount === undefined) {
            throw new RequiredError('amount','Required parameter amount was null or undefined when calling initialize.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.email !== undefined) {
            formParams['email'] = requestParameters.email;
        }

        if (requestParameters.amount !== undefined) {
            formParams['amount'] = requestParameters.amount;
        }

        if (requestParameters.currency !== undefined) {
            formParams['currency'] = requestParameters.currency;
        }

        if (requestParameters.reference !== undefined) {
            formParams['reference'] = requestParameters.reference;
        }

        if (requestParameters.callback_url !== undefined) {
            formParams['callback_url'] = requestParameters.callback_url;
        }

        if (requestParameters.plan !== undefined) {
            formParams['plan'] = requestParameters.plan;
        }

        if (requestParameters.invoice_limit !== undefined) {
            formParams['invoice_limit'] = requestParameters.invoice_limit;
        }

        if (requestParameters.metadata !== undefined) {
            formParams['metadata'] = requestParameters.metadata;
        }

        if (requestParameters.channels) {
            formParams['channels'] = requestParameters.channels;
        }

        if (requestParameters.split_code !== undefined) {
            formParams['split_code'] = requestParameters.split_code;
        }

        if (requestParameters.subaccount !== undefined) {
            formParams['subaccount'] = requestParameters.subaccount;
        }

        if (requestParameters.transaction_charge !== undefined) {
            formParams['transaction_charge'] = requestParameters.transaction_charge;
        }

        if (requestParameters.bearer !== undefined) {
            formParams['bearer'] = requestParameters.bearer;
        }


        const response = await this.request({
            path: `/transaction/initialize`,
            method: 'POST',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * List transactions that has occurred on your integration
     * List Transactions
     */
    async list(requestParameters: ListRequest): Promise<Response> {
        const queryParameters: any = {};

        if (requestParameters.perPage !== undefined) {
            queryParameters['perPage'] = requestParameters.perPage;
        }

        if (requestParameters.page !== undefined) {
            queryParameters['page'] = requestParameters.page;
        }

        if (requestParameters.from !== undefined) {
            queryParameters['from'] = (requestParameters.from as any).toISOString();
        }

        if (requestParameters.to !== undefined) {
            queryParameters['to'] = (requestParameters.to as any).toISOString();
        }


        const response = await this.request({
            path: `/transaction`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Partial Debit
     */
    async partialDebit(requestParameters: PartialDebitRequest): Promise<Response> {
        if (requestParameters.email === null || requestParameters.email === undefined) {
            throw new RequiredError('email','Required parameter email was null or undefined when calling partialDebit.');
        }
        if (requestParameters.amount === null || requestParameters.amount === undefined) {
            throw new RequiredError('amount','Required parameter amount was null or undefined when calling partialDebit.');
        }
        if (requestParameters.authorization_code === null || requestParameters.authorization_code === undefined) {
            throw new RequiredError('authorization_code','Required parameter authorization_code was null or undefined when calling partialDebit.');
        }
        if (requestParameters.currency === null || requestParameters.currency === undefined) {
            throw new RequiredError('currency','Required parameter currency was null or undefined when calling partialDebit.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

        if (requestParameters.email !== undefined) {
            formParams['email'] = requestParameters.email;
        }

        if (requestParameters.amount !== undefined) {
            formParams['amount'] = requestParameters.amount;
        }

        if (requestParameters.authorization_code !== undefined) {
            formParams['authorization_code'] = requestParameters.authorization_code;
        }

        if (requestParameters.currency !== undefined) {
            formParams['currency'] = requestParameters.currency;
        }

        if (requestParameters.reference !== undefined) {
            formParams['reference'] = requestParameters.reference;
        }

        if (requestParameters.at_least !== undefined) {
            formParams['at_least'] = requestParameters.at_least;
        }


        const response = await this.request({
            path: `/transaction/partial_debit`,
            method: 'POST',
            query: queryParameters,
            body: formParams,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Get Transaction Session
     */
    async session(requestParameters: SessionRequest): Promise<Response> {
        if (requestParameters.id === null || requestParameters.id === undefined) {
            throw new RequiredError('id','Required parameter id was null or undefined when calling session.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/transaction/{id}/session`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters.id))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Get the details about the lifecycle of a transaction from initiation to completion
     * Fetch Transaction Timeline
     */
    async timeline(requestParameters: TimelineRequest): Promise<Response> {
        if (requestParameters.id_or_reference === null || requestParameters.id_or_reference === undefined) {
            throw new RequiredError('id_or_reference','Required parameter id_or_reference was null or undefined when calling timeline.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/transaction/timeline/{id_or_reference}`.replace(`{${"id_or_reference"}}`, encodeURIComponent(String(requestParameters.id_or_reference))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Get the total amount of all transactions
     * Transaction Totals
     */
    async totals(requestParameters: TotalsRequest): Promise<Response> {
        const queryParameters: any = {};

        if (requestParameters.perPage !== undefined) {
            queryParameters['perPage'] = requestParameters.perPage;
        }

        if (requestParameters.page !== undefined) {
            queryParameters['page'] = requestParameters.page;
        }

        if (requestParameters.from !== undefined) {
            queryParameters['from'] = (requestParameters.from as any).toISOString();
        }

        if (requestParameters.to !== undefined) {
            queryParameters['to'] = (requestParameters.to as any).toISOString();
        }


        const response = await this.request({
            path: `/transaction/totals`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Verify a previously initiated transaction using it\'s reference
     * Verify Transaction
     */
    async verify(requestParameters: VerifyRequest): Promise<Response> {
        if (requestParameters.reference === null || requestParameters.reference === undefined) {
            throw new RequiredError('reference','Required parameter reference was null or undefined when calling verify.');
        }
        const queryParameters: any = {};


        const response = await this.request({
            path: `/transaction/verify/{reference}`.replace(`{${"reference"}}`, encodeURIComponent(String(requestParameters.reference))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

}
