/* 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 {
  ConferenceRoomListResponse,
  ConferenceRoomResponse,
} from '../models/index';
import {
    ConferenceRoomListResponseFromJSON,
    ConferenceRoomListResponseToJSON,
    ConferenceRoomResponseFromJSON,
    ConferenceRoomResponseToJSON,
} from '../models/index';

export interface CreateSiteConferenceRoomRequest {
    siteId: number;
    name: string;
    pin: string | null;
    moderatorPin: string | null;
    profile?: string | null;
    channelLimit?: number;
    greeting?: Blob | null;
    musicOnHold?: Blob | null;
}

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

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

export interface ListSiteConferenceRoomsRequest {
    siteId: number;
}

export interface TransferConferenceRoomToNewSiteRequest {
    siteId: number;
    id: number;
    newSiteId: number;
}

export interface UpdateSiteConferenceRoomByIdRequest {
    siteId: number;
    id: number;
    name: string;
    pin: string | null;
    moderatorPin: string | null;
    profile?: string | null;
    channelLimit?: number;
    greeting?: Blob | null;
    musicOnHold?: Blob | null;
}

export interface UploadSiteConferenceRoomAudioRequest {
    siteId: number;
    id: number;
    greeting?: Blob | null;
    musicOnHold?: Blob | null;
}

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

    /**
     * Adds a new conference room to the specified site. Requires providing a name, participant PIN, and moderator PIN. Greeting and music-on-hold audio files can also be uploaded during creation. 
     * Create a Conference Room for a Site
     */
    async createSiteConferenceRoomRaw(requestParameters: CreateSiteConferenceRoomRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ConferenceRoomResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling createSiteConferenceRoom().'
            );
        }

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

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

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

        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;
        // 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['moderatorPin'] != null) {
            formParams.append('moderator_pin', requestParameters['moderatorPin'] as any);
        }

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

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

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

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

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

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

    /**
     * Adds a new conference room to the specified site. Requires providing a name, participant PIN, and moderator PIN. Greeting and music-on-hold audio files can also be uploaded during creation. 
     * Create a Conference Room for a Site
     */
    async createSiteConferenceRoom(requestParameters: CreateSiteConferenceRoomRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ConferenceRoomResponse> {
        const response = await this.createSiteConferenceRoomRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently deletes a specific conference room from the site.
     * Delete a Conference Room
     */
    async deleteSiteConferenceRoomByIdRaw(requestParameters: DeleteSiteConferenceRoomByIdRequest, 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 deleteSiteConferenceRoomById().'
            );
        }

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

        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}/conference-rooms/{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 specific conference room from the site.
     * Delete a Conference Room
     */
    async deleteSiteConferenceRoomById(requestParameters: DeleteSiteConferenceRoomByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteSiteConferenceRoomByIdRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieves detailed information for a specific conference room by its ID, belonging to the specified site.
     * Get Conference Room Details
     */
    async getSiteConferenceRoomByIdRaw(requestParameters: GetSiteConferenceRoomByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ConferenceRoomResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling getSiteConferenceRoomById().'
            );
        }

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

        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}/conference-rooms/{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) => ConferenceRoomResponseFromJSON(jsonValue));
    }

    /**
     * Retrieves detailed information for a specific conference room by its ID, belonging to the specified site.
     * Get Conference Room Details
     */
    async getSiteConferenceRoomById(requestParameters: GetSiteConferenceRoomByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ConferenceRoomResponse> {
        const response = await this.getSiteConferenceRoomByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves a list of all conference rooms configured for the specified site.
     * List Conference Rooms for a Site
     */
    async listSiteConferenceRoomsRaw(requestParameters: ListSiteConferenceRoomsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ConferenceRoomListResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling listSiteConferenceRooms().'
            );
        }

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

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

    /**
     * Retrieves a list of all conference rooms configured for the specified site.
     * List Conference Rooms for a Site
     */
    async listSiteConferenceRooms(requestParameters: ListSiteConferenceRoomsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ConferenceRoomListResponse> {
        const response = await this.listSiteConferenceRoomsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Moves a conference room from its current site (specified in the path) to a new target site (specified in the request body) within the same customer account. 
     * Transfer Conference Room to Another Site
     */
    async transferConferenceRoomToNewSiteRaw(requestParameters: TransferConferenceRoomToNewSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ConferenceRoomResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling transferConferenceRoomToNewSite().'
            );
        }

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

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

        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: 'application/x-www-form-urlencoded' },
        ];
        // @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['newSiteId'] != null) {
            formParams.append('new_site_id', requestParameters['newSiteId'] as any);
        }

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

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

    /**
     * Moves a conference room from its current site (specified in the path) to a new target site (specified in the request body) within the same customer account. 
     * Transfer Conference Room to Another Site
     */
    async transferConferenceRoomToNewSite(requestParameters: TransferConferenceRoomToNewSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ConferenceRoomResponse> {
        const response = await this.transferConferenceRoomToNewSiteRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Updates the configuration for a specific conference room on a site. Allows changing the name, PINs, profile, and audio files (greeting, music on hold). 
     * Update Conference Room Configuration
     */
    async updateSiteConferenceRoomByIdRaw(requestParameters: UpdateSiteConferenceRoomByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ConferenceRoomResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling updateSiteConferenceRoomById().'
            );
        }

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

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

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

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

        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;
        // 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['moderatorPin'] != null) {
            formParams.append('moderator_pin', requestParameters['moderatorPin'] as any);
        }

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

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

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

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

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

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

    /**
     * Updates the configuration for a specific conference room on a site. Allows changing the name, PINs, profile, and audio files (greeting, music on hold). 
     * Update Conference Room Configuration
     */
    async updateSiteConferenceRoomById(requestParameters: UpdateSiteConferenceRoomByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ConferenceRoomResponse> {
        const response = await this.updateSiteConferenceRoomByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Uploads or updates the greeting and/or music on hold audio files for a specific conference room. This is a PATCH operation as it modifies specific parts of the conference room resource (its audio files). The original Teliax API had this as PATCH. 
     * Upload Conference Room Audio Files
     */
    async uploadSiteConferenceRoomAudioRaw(requestParameters: UploadSiteConferenceRoomAudioRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ConferenceRoomResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling uploadSiteConferenceRoomAudio().'
            );
        }

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

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

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

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

        const response = await this.request({
            path: `/sites/{site_id}/conference-rooms/{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) => ConferenceRoomResponseFromJSON(jsonValue));
    }

    /**
     * Uploads or updates the greeting and/or music on hold audio files for a specific conference room. This is a PATCH operation as it modifies specific parts of the conference room resource (its audio files). The original Teliax API had this as PATCH. 
     * Upload Conference Room Audio Files
     */
    async uploadSiteConferenceRoomAudio(requestParameters: UploadSiteConferenceRoomAudioRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ConferenceRoomResponse> {
        const response = await this.uploadSiteConferenceRoomAudioRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
