/* 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 {
  SchemasError,
  SiteDestinationList,
  SiteFailOverList,
  SiteListResponse,
  SiteRequest,
  SiteResponse,
  SitesComponentsSchemasError,
} from '../models/index';
import {
    SchemasErrorFromJSON,
    SchemasErrorToJSON,
    SiteDestinationListFromJSON,
    SiteDestinationListToJSON,
    SiteFailOverListFromJSON,
    SiteFailOverListToJSON,
    SiteListResponseFromJSON,
    SiteListResponseToJSON,
    SiteRequestFromJSON,
    SiteRequestToJSON,
    SiteResponseFromJSON,
    SiteResponseToJSON,
    SitesComponentsSchemasErrorFromJSON,
    SitesComponentsSchemasErrorToJSON,
} from '../models/index';

export interface CreateSiteRequest {
    siteRequest: SiteRequest;
}

export interface DeleteSiteByIdRequest {
    id: number;
}

export interface GetSiteByIdRequest {
    id: number;
}

export interface PotentialDestinationsSitesClassNameRequest {
    className: string;
    id: number;
}

export interface PotentialFailOversSitesClassNameRequest {
    id: number;
    className: string;
}

export interface RebuildSiteRequest {
    id: number;
}

export interface UpdateSiteByIdRequest {
    id: number;
    active: boolean;
    acl: string;
    dnsExtension?: string;
    callerIdName?: string;
    callerIdNumber?: string;
    thinClientId?: number;
    channelLimit?: number;
    permittedCountryCodes?: Array<string>;
}

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

    /**
     * Creates a new site with the specified configurations.
     * Create a New Site
     */
    async createSiteRaw(requestParameters: CreateSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteResponse>> {
        if (requestParameters['siteRequest'] == null) {
            throw new runtime.RequiredError(
                'siteRequest',
                'Required parameter "siteRequest" was null or undefined when calling createSite().'
            );
        }

        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`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: SiteRequestToJSON(requestParameters['siteRequest']),
        }, initOverrides);

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

    /**
     * Creates a new site with the specified configurations.
     * Create a New Site
     */
    async createSite(requestParameters: CreateSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteResponse> {
        const response = await this.createSiteRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently deletes a specific site and all its associated telephony features (e.g., devices, numbers, menus). This action cannot be undone. 
     * Delete a Site
     */
    async deleteSiteByIdRaw(requestParameters: DeleteSiteByIdRequest, 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 deleteSiteById().'
            );
        }

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

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Permanently deletes a specific site and all its associated telephony features (e.g., devices, numbers, menus). This action cannot be undone. 
     * Delete a Site
     */
    async deleteSiteById(requestParameters: DeleteSiteByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteSiteByIdRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieves detailed information for a specific site by its ID.
     * Get Site Details
     */
    async getSiteByIdRaw(requestParameters: GetSiteByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling getSiteById().'
            );
        }

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

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

    /**
     * Retrieves detailed information for a specific site by its ID.
     * Get Site Details
     */
    async getSiteById(requestParameters: GetSiteByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteResponse> {
        const response = await this.getSiteByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves a list of all sites associated with the authenticated customer\'s account.
     * List Sites
     */
    async listSitesRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteListResponse>> {
        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`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Retrieves a list of all sites associated with the authenticated customer\'s account.
     * List Sites
     */
    async listSites(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteListResponse> {
        const response = await this.listSitesRaw(initOverrides);
        return await response.value();
    }

    /**
     * Retrieve all potential destinations on a site that are of a certain type.
     * Destinations for a Site of a certain type
     */
    async potentialDestinationsSitesClassNameRaw(requestParameters: PotentialDestinationsSitesClassNameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteDestinationList>> {
        if (requestParameters['className'] == null) {
            throw new runtime.RequiredError(
                'className',
                'Required parameter "className" was null or undefined when calling potentialDestinationsSitesClassName().'
            );
        }

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

        const queryParameters: any = {};

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

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

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

    /**
     * Retrieve all potential destinations on a site that are of a certain type.
     * Destinations for a Site of a certain type
     */
    async potentialDestinationsSitesClassName(requestParameters: PotentialDestinationsSitesClassNameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteDestinationList> {
        const response = await this.potentialDestinationsSitesClassNameRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieve all potential fail overs on a site that are of a certain type
     * Failovers for a Site of a certain type
     */
    async potentialFailOversSitesClassNameRaw(requestParameters: PotentialFailOversSitesClassNameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteFailOverList>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling potentialFailOversSitesClassName().'
            );
        }

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

        const queryParameters: any = {};

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

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

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

    /**
     * Retrieve all potential fail overs on a site that are of a certain type
     * Failovers for a Site of a certain type
     */
    async potentialFailOversSitesClassName(requestParameters: PotentialFailOversSitesClassNameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteFailOverList> {
        const response = await this.potentialFailOversSitesClassNameRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Rebuild a site. Can be used if newly added calling features did not automatically get registered. Rebuild, will synchronize your site with the associated thin client and refresh the Site.
     * Rebuild Site
     */
    async rebuildSiteRaw(requestParameters: RebuildSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling rebuildSite().'
            );
        }

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

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

    /**
     * Rebuild a site. Can be used if newly added calling features did not automatically get registered. Rebuild, will synchronize your site with the associated thin client and refresh the Site.
     * Rebuild Site
     */
    async rebuildSite(requestParameters: RebuildSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteResponse> {
        const response = await this.rebuildSiteRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Updates the configuration for an existing site by its ID.
     * Update Site Configuration
     */
    async updateSiteByIdRaw(requestParameters: UpdateSiteByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SiteResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling updateSiteById().'
            );
        }

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

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

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

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

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

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

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

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

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

        if (requestParameters['permittedCountryCodes'] != null) {
            formParams.append('permitted_country_codes', requestParameters['permittedCountryCodes']!.join(runtime.COLLECTION_FORMATS["csv"]));
        }

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

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

    /**
     * Updates the configuration for an existing site by its ID.
     * Update Site Configuration
     */
    async updateSiteById(requestParameters: UpdateSiteByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SiteResponse> {
        const response = await this.updateSiteByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
