/* 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 AddSplitRequest {
    account_number: string;
    subaccount?: string;
    split_code?: string;
}

export interface CreateRequest {
    customer: string;
    preferred_bank?: string;
    subaccount?: string;
    split_code?: string;
}

export interface DeactivateRequest {
    account_id: string;
}

export interface FetchRequest {
    account_id: string;
}

export interface ListRequest {
    account_number?: string;
    customer?: string;
    active?: boolean;
    currency?: string;
    provider_slug?: string;
    bank_id?: string;
    perPage?: string;
    page?: string;
}

export interface RemoveSplitRequest {
    account_number: string;
    subaccount?: string;
    split_code?: string;
}

/**
 * 
 */
export class DedicatedVirtualAccount extends BaseAPI {

    /**
     * Split Dedicated Account Transaction
     */
    async addSplit(requestParameters: AddSplitRequest): Promise<Response> {
        if (requestParameters.account_number === null || requestParameters.account_number === undefined) {
            throw new RequiredError('account_number','Required parameter account_number was null or undefined when calling addSplit.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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

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


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

    /**
     * Fetch Bank Providers
     */
    async availableProviders(): Promise<Response> {
        const queryParameters: any = {};


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

    /**
     * Create Dedicated Account
     */
    async create(requestParameters: CreateRequest): Promise<Response> {
        if (requestParameters.customer === null || requestParameters.customer === undefined) {
            throw new RequiredError('customer','Required parameter customer was null or undefined when calling create.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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

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

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


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

    /**
     * Deactivate Dedicated Account
     */
    async deactivate(requestParameters: DeactivateRequest): Promise<Response> {
        if (requestParameters.account_id === null || requestParameters.account_id === undefined) {
            throw new RequiredError('account_id','Required parameter account_id was null or undefined when calling deactivate.');
        }
        const queryParameters: any = {};


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

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


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

    /**
     * List Dedicated Accounts
     */
    async list(requestParameters: ListRequest): Promise<Response> {
        const queryParameters: any = {};

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

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

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

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

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

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

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

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


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

    /**
     * Remove Split from Dedicated Account
     */
    async removeSplit(requestParameters: RemoveSplitRequest): Promise<Response> {
        if (requestParameters.account_number === null || requestParameters.account_number === undefined) {
            throw new RequiredError('account_number','Required parameter account_number was null or undefined when calling removeSplit.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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

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


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

}
