/* tslint:disable */
/* eslint-disable */
/**
 * Ringer Business API
 * This API provides comprehensive endpoints for the Ringer Business system. It includes functionality for managing customer accounts, addresses, sites, phone numbers, payments, users, and other business resources.  Operations typically require authentication and appropriate permissions. 
 *
 * The version of the OpenAPI document: 1.0.6
 * Contact: support@ringer.tel
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


import * as runtime from '../runtime';
import type {
  CreditCardCreateRequest,
  CreditCardListResponse,
  CreditCardResponse,
  CreditCardUpdateRequest,
  CreditCardsComponentsSchemasError,
} from '../models/index';
import {
    CreditCardCreateRequestFromJSON,
    CreditCardCreateRequestToJSON,
    CreditCardListResponseFromJSON,
    CreditCardListResponseToJSON,
    CreditCardResponseFromJSON,
    CreditCardResponseToJSON,
    CreditCardUpdateRequestFromJSON,
    CreditCardUpdateRequestToJSON,
    CreditCardsComponentsSchemasErrorFromJSON,
    CreditCardsComponentsSchemasErrorToJSON,
} from '../models/index';

export interface CreateCreditCardRequest {
    creditCardCreateRequest: CreditCardCreateRequest;
}

export interface CreditCardDetailsRequest {
    id: number;
}

export interface DeleteCreditCardRequest {
    id: number;
}

export interface UpdateCreditCardRequest {
    id: number;
    creditCardUpdateRequest: CreditCardUpdateRequest;
}

export interface VerifyCreditCardRequest {
    id: number;
    amountInDollars?: number;
}

/**
 * 
 */
export class CreditCardsApi extends runtime.BaseAPI {

    /**
     * Adds a new credit card to the authenticated customer\'s account. The full card number is tokenized by the payment processor; only partial information (like last4, brand, expiry) is stored and returned by this API. A verification step is typically required after adding a new card. 
     * Add a New Credit Card
     */
    async createCreditCardRaw(requestParameters: CreateCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<CreditCardResponse>> {
        if (requestParameters['creditCardCreateRequest'] == null) {
            throw new runtime.RequiredError(
                'creditCardCreateRequest',
                'Required parameter "creditCardCreateRequest" was null or undefined when calling createCreditCard().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.accessToken) {
            // oauth required
            headerParameters["Authorization"] = await this.configuration.accessToken("oAuth2", []);
        }

        const response = await this.request({
            path: `/credit-cards`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: CreditCardCreateRequestToJSON(requestParameters['creditCardCreateRequest']),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => CreditCardResponseFromJSON(jsonValue));
    }

    /**
     * Adds a new credit card to the authenticated customer\'s account. The full card number is tokenized by the payment processor; only partial information (like last4, brand, expiry) is stored and returned by this API. A verification step is typically required after adding a new card. 
     * Add a New Credit Card
     */
    async createCreditCard(requestParameters: CreateCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<CreditCardResponse> {
        const response = await this.createCreditCardRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieve information about a Credit Card. The information returned is: 1. name 2. priority 3. active 4. expired 5. verified
     * Credit Card Details
     */
    async creditCardDetailsRaw(requestParameters: CreditCardDetailsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<CreditCardResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling creditCardDetails().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            // oauth required
            headerParameters["Authorization"] = await this.configuration.accessToken("oAuth2", []);
        }

        const response = await this.request({
            path: `/credit-cards/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => CreditCardResponseFromJSON(jsonValue));
    }

    /**
     * Retrieve information about a Credit Card. The information returned is: 1. name 2. priority 3. active 4. expired 5. verified
     * Credit Card Details
     */
    async creditCardDetails(requestParameters: CreditCardDetailsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<CreditCardResponse> {
        const response = await this.creditCardDetailsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Delete Credit Card
     * Delete Credit Card
     */
    async deleteCreditCardRaw(requestParameters: DeleteCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling deleteCreditCard().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            // oauth required
            headerParameters["Authorization"] = await this.configuration.accessToken("oAuth2", []);
        }

        const response = await this.request({
            path: `/credit-cards/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete Credit Card
     * Delete Credit Card
     */
    async deleteCreditCard(requestParameters: DeleteCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteCreditCardRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieves a list of all credit cards associated with the authenticated customer\'s account.
     * List Credit Cards
     */
    async listCreditCardsRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<CreditCardListResponse>> {
        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            // oauth required
            headerParameters["Authorization"] = await this.configuration.accessToken("oAuth2", []);
        }

        const response = await this.request({
            path: `/credit-cards`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => CreditCardListResponseFromJSON(jsonValue));
    }

    /**
     * Retrieves a list of all credit cards associated with the authenticated customer\'s account.
     * List Credit Cards
     */
    async listCreditCards(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<CreditCardListResponse> {
        const response = await this.listCreditCardsRaw(initOverrides);
        return await response.value();
    }

    /**
     * Update Credit Card
     * Update Credit Card
     */
    async updateCreditCardRaw(requestParameters: UpdateCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<CreditCardResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling updateCreditCard().'
            );
        }

        if (requestParameters['creditCardUpdateRequest'] == null) {
            throw new runtime.RequiredError(
                'creditCardUpdateRequest',
                'Required parameter "creditCardUpdateRequest" was null or undefined when calling updateCreditCard().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.accessToken) {
            // oauth required
            headerParameters["Authorization"] = await this.configuration.accessToken("oAuth2", []);
        }

        const response = await this.request({
            path: `/credit-cards/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'PUT',
            headers: headerParameters,
            query: queryParameters,
            body: CreditCardUpdateRequestToJSON(requestParameters['creditCardUpdateRequest']),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => CreditCardResponseFromJSON(jsonValue));
    }

    /**
     * Update Credit Card
     * Update Credit Card
     */
    async updateCreditCard(requestParameters: UpdateCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<CreditCardResponse> {
        const response = await this.updateCreditCardRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * When a credit card is added to your account, a small amount will be charged to the card. To verify that you are the owner of the credit card. The amount should match the amount charged.
     * Verify Credit Card
     */
    async verifyCreditCardRaw(requestParameters: VerifyCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<CreditCardResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling verifyCreditCard().'
            );
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            // oauth required
            headerParameters["Authorization"] = await this.configuration.accessToken("oAuth2", []);
        }

        const consumes: runtime.Consume[] = [
            { contentType: 'multipart/form-data' },
        ];
        // @ts-ignore: canConsumeForm may be unused
        const canConsumeForm = runtime.canConsumeForm(consumes);

        let formParams: { append(param: string, value: any): any };
        let useForm = false;
        if (useForm) {
            formParams = new FormData();
        } else {
            formParams = new URLSearchParams();
        }

        if (requestParameters['amountInDollars'] != null) {
            formParams.append('amount_in_dollars', requestParameters['amountInDollars'] as any);
        }

        const response = await this.request({
            path: `/credit-cards/{id}/verify`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: formParams,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => CreditCardResponseFromJSON(jsonValue));
    }

    /**
     * When a credit card is added to your account, a small amount will be charged to the card. To verify that you are the owner of the credit card. The amount should match the amount charged.
     * Verify Credit Card
     */
    async verifyCreditCard(requestParameters: VerifyCreditCardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<CreditCardResponse> {
        const response = await this.verifyCreditCardRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
