/* 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 CreateRequest {
    business_name: string;
    settlement_bank: string;
    account_number: string;
    percentage_charge: number;
    description?: string;
    primary_contact_email?: string;
    primary_contact_name?: string;
    primary_contact_phone?: string;
    metadata?: string;
}

export interface FetchRequest {
    code: string;
}

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

export interface UpdateRequest {
    code: string;
    business_name?: string;
    settlement_bank?: string;
    account_number?: string;
    active?: boolean;
    percentage_charge?: number;
    description?: string;
    primary_contact_email?: string;
    primary_contact_name?: string;
    primary_contact_phone?: string;
    metadata?: string;
}

/**
 * 
 */
export class Subaccount extends BaseAPI {

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

        let formParams: any = {};

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

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

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

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

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

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

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

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

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


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

    /**
     * Fetch Subaccount
     */
    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: `/subaccount/{code}`.replace(`{${"code"}}`, encodeURIComponent(String(requestParameters.code))),
            method: 'GET',
            query: queryParameters,
        });
        
        return ResponseFromJSON(response);
    }

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

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

        let formParams: any = {};

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

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

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

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

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

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

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

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

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

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


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

}
