/* 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,
    TransferInitiate,
    ResponseFromJSON
} from '../models';

export interface BulkRequest {
    source?: string;
    transfers?: Array<TransferInitiate>;
}

export interface DisableOtpFinalizeRequest {
    otp: string;
}

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

export interface FetchRequest {
    code: string;
}

export interface FinalizeRequest {
    transfer_code: string;
    otp: string;
}

export interface InitiateRequest {
    source: string;
    amount: string;
    recipient: string;
    reason?: string;
    currency?: string;
    reference?: string;
}

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

export interface ResendOtpRequest {
    transfer_code: string;
    reason: string;
}

export interface VerifyRequest {
    reference: string;
}

/**
 * 
 */
export class Transfer extends BaseAPI {

    /**
     * Initiate Bulk Transfer
     */
    async bulk(requestParameters: BulkRequest): Promise<Response> {
        const queryParameters: any = {};

        let formParams: any = {};

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

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


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

    /**
     * Disable OTP requirement for Transfers
     */
    async disableOtp(): Promise<Response> {
        const queryParameters: any = {};


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

    /**
     * Finalize Disabling of OTP requirement for Transfers
     */
    async disableOtpFinalize(requestParameters: DisableOtpFinalizeRequest): Promise<Response> {
        if (requestParameters.otp === null || requestParameters.otp === undefined) {
            throw new RequiredError('otp','Required parameter otp was null or undefined when calling disableOtpFinalize.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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


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

    /**
     * Export Transfers
     */
    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.status !== undefined) {
            queryParameters['status'] = requestParameters.status;
        }

        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: `/transfer/export`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Enable OTP requirement for Transfers
     */
    async enableOtp(): Promise<Response> {
        const queryParameters: any = {};


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

    /**
     * Fetch Transfer
     */
    async fetch(requestParameters: FetchRequest): Promise<Response> {
        if (requestParameters.code === null || requestParameters.code === undefined) {
            throw new RequiredError('code','Required parameter code was null or undefined when calling fetch.');
        }
        const queryParameters: any = {};


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

    /**
     * Finalize Transfer
     */
    async finalize(requestParameters: FinalizeRequest): Promise<Response> {
        if (requestParameters.transfer_code === null || requestParameters.transfer_code === undefined) {
            throw new RequiredError('transfer_code','Required parameter transfer_code was null or undefined when calling finalize.');
        }
        if (requestParameters.otp === null || requestParameters.otp === undefined) {
            throw new RequiredError('otp','Required parameter otp was null or undefined when calling finalize.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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


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

    /**
     * Initiate Transfer
     */
    async initiate(requestParameters: InitiateRequest): Promise<Response> {
        if (requestParameters.source === null || requestParameters.source === undefined) {
            throw new RequiredError('source','Required parameter source was null or undefined when calling initiate.');
        }
        if (requestParameters.amount === null || requestParameters.amount === undefined) {
            throw new RequiredError('amount','Required parameter amount was null or undefined when calling initiate.');
        }
        if (requestParameters.recipient === null || requestParameters.recipient === undefined) {
            throw new RequiredError('recipient','Required parameter recipient was null or undefined when calling initiate.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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

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

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

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

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


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

    /**
     * List Transfers
     */
    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.status !== undefined) {
            queryParameters['status'] = requestParameters.status;
        }

        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: `/transfer`,
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

    /**
     * Resend OTP for Transfer
     */
    async resendOtp(requestParameters: ResendOtpRequest): Promise<Response> {
        if (requestParameters.transfer_code === null || requestParameters.transfer_code === undefined) {
            throw new RequiredError('transfer_code','Required parameter transfer_code was null or undefined when calling resendOtp.');
        }
        if (requestParameters.reason === null || requestParameters.reason === undefined) {
            throw new RequiredError('reason','Required parameter reason was null or undefined when calling resendOtp.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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


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

    /**
     * Verify Transfer
     */
    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: `/transfer/verify/{reference}`.replace(`{${"reference"}}`, encodeURIComponent(String(requestParameters.reference))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

}
