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

export interface CreateRequest {
    email: string;
    first_name?: string;
    last_name?: string;
    phone?: string;
    metadata?: string;
}

export interface DeactivateAuthorizationRequest {
    authorization_code: string;
}

export interface FetchRequest {
    code: string;
}

export interface ListRequest {
    use_cursor?: boolean;
    next?: string;
    previous?: string;
    from?: string;
    to?: string;
    perPage?: string;
    page?: string;
}

export interface RiskActionRequest {
    customer: string;
    risk_action?: string;
}

export interface UpdateRequest {
    code: string;
    first_name?: string;
    last_name?: string;
    phone?: string;
    metadata?: string;
}

export interface ValidateRequest {
    code: string;
    first_name: string;
    last_name: string;
    type: string;
    country: string;
    bvn: string;
    bank_code: string;
    account_number: string;
    value?: string;
}

/**
 * 
 */
export class Customer extends BaseAPI {

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

        let formParams: any = {};

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

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

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

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

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


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

    /**
     * Deactivate a customer\'s card
     * Deactivate Authorization
     */
    async deactivateAuthorization(requestParameters: DeactivateAuthorizationRequest): Promise<Response> {
        if (requestParameters.authorization_code === null || requestParameters.authorization_code === undefined) {
            throw new RequiredError('authorization_code','Required parameter authorization_code was null or undefined when calling deactivateAuthorization.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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


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

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

    /**
     * List customers on your integration
     * List Customers
     */
    async list(requestParameters: ListRequest): Promise<Response> {
        const queryParameters: any = {};

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

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

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

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

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

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

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


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

    /**
     * Set customer\'s risk action by whitelisting or blacklisting the customer
     * White/blacklist Customer
     */
    async riskAction(requestParameters: RiskActionRequest): Promise<Response> {
        if (requestParameters.customer === null || requestParameters.customer === undefined) {
            throw new RequiredError('customer','Required parameter customer was null or undefined when calling riskAction.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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


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

    /**
     * Update Customer
     */
    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.first_name !== undefined) {
            formParams['first_name'] = requestParameters.first_name;
        }

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

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

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


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

    /**
     * Validate a customer\'s identity
     * Validate Customer
     */
    async validate(requestParameters: ValidateRequest): Promise<Accepted> {
        if (requestParameters.code === null || requestParameters.code === undefined) {
            throw new RequiredError('code','Required parameter code was null or undefined when calling validate.');
        }
        if (requestParameters.first_name === null || requestParameters.first_name === undefined) {
            throw new RequiredError('first_name','Required parameter first_name was null or undefined when calling validate.');
        }
        if (requestParameters.last_name === null || requestParameters.last_name === undefined) {
            throw new RequiredError('last_name','Required parameter last_name was null or undefined when calling validate.');
        }
        if (requestParameters.type === null || requestParameters.type === undefined) {
            throw new RequiredError('type','Required parameter type was null or undefined when calling validate.');
        }
        if (requestParameters.country === null || requestParameters.country === undefined) {
            throw new RequiredError('country','Required parameter country was null or undefined when calling validate.');
        }
        if (requestParameters.bvn === null || requestParameters.bvn === undefined) {
            throw new RequiredError('bvn','Required parameter bvn was null or undefined when calling validate.');
        }
        if (requestParameters.bank_code === null || requestParameters.bank_code === undefined) {
            throw new RequiredError('bank_code','Required parameter bank_code was null or undefined when calling validate.');
        }
        if (requestParameters.account_number === null || requestParameters.account_number === undefined) {
            throw new RequiredError('account_number','Required parameter account_number was null or undefined when calling validate.');
        }
        const queryParameters: any = {};

        let formParams: any = {};

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

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

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

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

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

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

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

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


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

}
