/* 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 {
  PaginatedVoicemailBoxListResponse,
  TransferVoiceMailBoxRequest,
  VoicemailBoxRequest,
  VoicemailBoxResponseData,
} from '../models/index';
import {
    PaginatedVoicemailBoxListResponseFromJSON,
    PaginatedVoicemailBoxListResponseToJSON,
    TransferVoiceMailBoxRequestFromJSON,
    TransferVoiceMailBoxRequestToJSON,
    VoicemailBoxRequestFromJSON,
    VoicemailBoxRequestToJSON,
    VoicemailBoxResponseDataFromJSON,
    VoicemailBoxResponseDataToJSON,
} from '../models/index';

export interface CreateSiteVoicemailBoxRequest {
    siteId: number;
    name: string;
    pin: string;
    status: CreateSiteVoicemailBoxStatusEnum;
    notificationEmails?: string;
    announcementUrl?: string | null;
    announcement?: Blob | null;
    siteId2?: number | null;
    createdAt?: Date;
    updatedAt?: Date;
}

export interface DeleteSiteVoicemailBoxByIdRequest {
    siteId: number;
    id: number;
}

export interface GetSiteVoicemailBoxByIdRequest {
    siteId: number;
    id: number;
}

export interface ListSiteAvailableVoicemailBoxesRequest {
    siteId: number;
    userId?: number;
}

export interface ListSiteVoicemailBoxesRequest {
    siteId: number;
    page?: number;
    pageSize?: number;
}

export interface PatchVoiceMailBoxAnnouncementRequest {
    siteId: number;
    id: number;
    announcement?: Blob;
}

export interface TransferVoiceMailBoxOperationRequest {
    siteId: number;
    id: number;
    transferVoiceMailBoxRequest: TransferVoiceMailBoxRequest;
}

export interface UpdateSiteVoicemailBoxByIdRequest {
    siteId: number;
    id: number;
    voicemailBoxRequest: VoicemailBoxRequest;
}

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

    /**
     * Adds a new voicemail box to the specified site. Announcement greeting can be uploaded.
     * Create Voicemail Box for a Site
     */
    async createSiteVoicemailBoxRaw(requestParameters: CreateSiteVoicemailBoxRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<VoicemailBoxResponseData>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling createSiteVoicemailBox().'
            );
        }

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

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

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

        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;
        // use FormData to transmit files using content-type "multipart/form-data"
        useForm = canConsumeForm;
        if (useForm) {
            formParams = new FormData();
        } else {
            formParams = new URLSearchParams();
        }

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

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

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

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

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

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

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

        if (requestParameters['createdAt'] != null) {
            formParams.append('created_at', (requestParameters['createdAt'] as any).toISOString());
        }

        if (requestParameters['updatedAt'] != null) {
            formParams.append('updated_at', (requestParameters['updatedAt'] as any).toISOString());
        }

        const response = await this.request({
            path: `/sites/{site_id}/voice-mail-boxes`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: formParams,
        }, initOverrides);

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

    /**
     * Adds a new voicemail box to the specified site. Announcement greeting can be uploaded.
     * Create Voicemail Box for a Site
     */
    async createSiteVoicemailBox(requestParameters: CreateSiteVoicemailBoxRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<VoicemailBoxResponseData> {
        const response = await this.createSiteVoicemailBoxRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently deletes a Voicemail Box.
     * Delete a Voicemail Box
     */
    async deleteSiteVoicemailBoxByIdRaw(requestParameters: DeleteSiteVoicemailBoxByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling deleteSiteVoicemailBoxById().'
            );
        }

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

        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: `/sites/{site_id}/voice-mail-boxes/{id}`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))).replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Permanently deletes a Voicemail Box.
     * Delete a Voicemail Box
     */
    async deleteSiteVoicemailBoxById(requestParameters: DeleteSiteVoicemailBoxByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteSiteVoicemailBoxByIdRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieves the details of a specific Voicemail Box.
     * Get Voicemail Box Details
     */
    async getSiteVoicemailBoxByIdRaw(requestParameters: GetSiteVoicemailBoxByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<VoicemailBoxResponseData>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling getSiteVoicemailBoxById().'
            );
        }

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

        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: `/sites/{site_id}/voice-mail-boxes/{id}`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))).replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Retrieves the details of a specific Voicemail Box.
     * Get Voicemail Box Details
     */
    async getSiteVoicemailBoxById(requestParameters: GetSiteVoicemailBoxByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<VoicemailBoxResponseData> {
        const response = await this.getSiteVoicemailBoxByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves available Voicemail Boxes that could be used by the Site or a User on the Site.
     * List Available Voicemail Boxes for a Site
     */
    async listSiteAvailableVoicemailBoxesRaw(requestParameters: ListSiteAvailableVoicemailBoxesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedVoicemailBoxListResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling listSiteAvailableVoicemailBoxes().'
            );
        }

        const queryParameters: any = {};

        if (requestParameters['userId'] != null) {
            queryParameters['user_id'] = requestParameters['userId'];
        }

        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: `/sites/{site_id}/voice-mail-boxes/available`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Retrieves available Voicemail Boxes that could be used by the Site or a User on the Site.
     * List Available Voicemail Boxes for a Site
     */
    async listSiteAvailableVoicemailBoxes(requestParameters: ListSiteAvailableVoicemailBoxesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedVoicemailBoxListResponse> {
        const response = await this.listSiteAvailableVoicemailBoxesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieve a paginated list of all voicemail boxes configured for the specified site.
     * List Voicemail Boxes for a Site
     */
    async listSiteVoicemailBoxesRaw(requestParameters: ListSiteVoicemailBoxesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PaginatedVoicemailBoxListResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling listSiteVoicemailBoxes().'
            );
        }

        const queryParameters: any = {};

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

        if (requestParameters['pageSize'] != null) {
            queryParameters['page_size'] = requestParameters['pageSize'];
        }

        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: `/sites/{site_id}/voice-mail-boxes`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Retrieve a paginated list of all voicemail boxes configured for the specified site.
     * List Voicemail Boxes for a Site
     */
    async listSiteVoicemailBoxes(requestParameters: ListSiteVoicemailBoxesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PaginatedVoicemailBoxListResponse> {
        const response = await this.listSiteVoicemailBoxesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Upload the greeting message for Voice Mail Box.
     * Upload Greeting Voice Mail Box
     */
    async patchVoiceMailBoxAnnouncementRaw(requestParameters: PatchVoiceMailBoxAnnouncementRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<VoicemailBoxResponseData>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling patchVoiceMailBoxAnnouncement().'
            );
        }

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

        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;
        // use FormData to transmit files using content-type "multipart/form-data"
        useForm = canConsumeForm;
        if (useForm) {
            formParams = new FormData();
        } else {
            formParams = new URLSearchParams();
        }

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

        const response = await this.request({
            path: `/sites/{site_id}/voice-mail-boxes/{id}/upload`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))).replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: formParams,
        }, initOverrides);

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

    /**
     * Upload the greeting message for Voice Mail Box.
     * Upload Greeting Voice Mail Box
     */
    async patchVoiceMailBoxAnnouncement(requestParameters: PatchVoiceMailBoxAnnouncementRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<VoicemailBoxResponseData> {
        const response = await this.patchVoiceMailBoxAnnouncementRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Transfer a Voice Mail Box to a different Site
     * Transfer Voice Mail Box
     */
    async transferVoiceMailBoxRaw(requestParameters: TransferVoiceMailBoxOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<VoicemailBoxResponseData>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling transferVoiceMailBox().'
            );
        }

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

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

        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: `/sites/{site_id}/voice-mail-boxes/{id}/transfer`.replace(`{${"siteId"}}`, encodeURIComponent(String(requestParameters['siteId']))).replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: TransferVoiceMailBoxRequestToJSON(requestParameters['transferVoiceMailBoxRequest']),
        }, initOverrides);

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

    /**
     * Transfer a Voice Mail Box to a different Site
     * Transfer Voice Mail Box
     */
    async transferVoiceMailBox(requestParameters: TransferVoiceMailBoxOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<VoicemailBoxResponseData> {
        const response = await this.transferVoiceMailBoxRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Updates an existing Voicemail Box. Provide only the attributes to be changed. To update the announcement greeting, use the dedicated upload endpoint. 
     * Update Voicemail Box
     */
    async updateSiteVoicemailBoxByIdRaw(requestParameters: UpdateSiteVoicemailBoxByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<VoicemailBoxResponseData>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling updateSiteVoicemailBoxById().'
            );
        }

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

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

        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: `/sites/{site_id}/voice-mail-boxes/{id}`.replace(`{${"site_id"}}`, encodeURIComponent(String(requestParameters['siteId']))).replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
            method: 'PUT',
            headers: headerParameters,
            query: queryParameters,
            body: VoicemailBoxRequestToJSON(requestParameters['voicemailBoxRequest']),
        }, initOverrides);

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

    /**
     * Updates an existing Voicemail Box. Provide only the attributes to be changed. To update the announcement greeting, use the dedicated upload endpoint. 
     * Update Voicemail Box
     */
    async updateSiteVoicemailBoxById(requestParameters: UpdateSiteVoicemailBoxByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<VoicemailBoxResponseData> {
        const response = await this.updateSiteVoicemailBoxByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

}

/**
 * @export
 */
export const CreateSiteVoicemailBoxStatusEnum = {
    Active: 'active',
    Inactive: 'inactive'
} as const;
export type CreateSiteVoicemailBoxStatusEnum = typeof CreateSiteVoicemailBoxStatusEnum[keyof typeof CreateSiteVoicemailBoxStatusEnum];
