/* 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 {
  DeviceComponentsSchemasError,
  DeviceListResponse,
  DeviceResponse,
  DeviceResponseWithPassword,
  DeviceStatus,
  IndexComponentsSchemasError,
  SchemasDeviceCore,
} from '../models/index';
import {
    DeviceComponentsSchemasErrorFromJSON,
    DeviceComponentsSchemasErrorToJSON,
    DeviceListResponseFromJSON,
    DeviceListResponseToJSON,
    DeviceResponseFromJSON,
    DeviceResponseToJSON,
    DeviceResponseWithPasswordFromJSON,
    DeviceResponseWithPasswordToJSON,
    DeviceStatusFromJSON,
    DeviceStatusToJSON,
    IndexComponentsSchemasErrorFromJSON,
    IndexComponentsSchemasErrorToJSON,
    SchemasDeviceCoreFromJSON,
    SchemasDeviceCoreToJSON,
} from '../models/index';

export interface CreateSiteDeviceRequest {
    siteId: number;
    schemasDeviceCore: SchemasDeviceCore;
}

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

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

export interface GetSiteDeviceStatusesRequest {
    siteId: number;
}

export interface ListSiteDevicesRequest {
    siteId: number;
}

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

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

export interface UpdateSiteDeviceByIdRequest {
    siteId: number;
    id: number;
    schemasDeviceCore: SchemasDeviceCore;
}

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

    /**
     * Adds a new device to the specified site. The system will generate login credentials (login and password) for the device. 
     * Create a Device for a Site
     */
    async createSiteDeviceRaw(requestParameters: CreateSiteDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DeviceResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling createSiteDevice().'
            );
        }

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

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

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

    /**
     * Adds a new device to the specified site. The system will generate login credentials (login and password) for the device. 
     * Create a Device for a Site
     */
    async createSiteDevice(requestParameters: CreateSiteDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceResponse> {
        const response = await this.createSiteDeviceRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently deletes a specific device from the site.
     * Delete a Device
     */
    async deleteSiteDeviceByIdRaw(requestParameters: DeleteSiteDeviceByIdRequest, 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 deleteSiteDeviceById().'
            );
        }

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

        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}/devices/{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 device from the site.
     * Delete a Device
     */
    async deleteSiteDeviceById(requestParameters: DeleteSiteDeviceByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteSiteDeviceByIdRaw(requestParameters, initOverrides);
    }

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

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

        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}/devices/{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) => DeviceResponseFromJSON(jsonValue));
    }

    /**
     * Retrieves detailed information for a specific device by its ID, belonging to the specified site.
     * Get Device Details
     */
    async getSiteDeviceById(requestParameters: GetSiteDeviceByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceResponse> {
        const response = await this.getSiteDeviceByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves the registration status for all devices configured on the specified site. Indicates which devices are currently online and registered with the call processing services. 
     * List Device Registration Statuses for a Site
     */
    async getSiteDeviceStatusesRaw(requestParameters: GetSiteDeviceStatusesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DeviceStatus>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling getSiteDeviceStatuses().'
            );
        }

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

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

    /**
     * Retrieves the registration status for all devices configured on the specified site. Indicates which devices are currently online and registered with the call processing services. 
     * List Device Registration Statuses for a Site
     */
    async getSiteDeviceStatuses(requestParameters: GetSiteDeviceStatusesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceStatus> {
        const response = await this.getSiteDeviceStatusesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves a list of all devices (e.g., IP phones, softphones) configured for the specified site.
     * List Devices for a Site
     */
    async listSiteDevicesRaw(requestParameters: ListSiteDevicesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DeviceListResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling listSiteDevices().'
            );
        }

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

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

    /**
     * Retrieves a list of all devices (e.g., IP phones, softphones) configured for the specified site.
     * List Devices for a Site
     */
    async listSiteDevices(requestParameters: ListSiteDevicesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceListResponse> {
        const response = await this.listSiteDevicesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Generates a new random SIP password for the specified device. The old password will no longer be valid. The device will need to be updated with the new password to re-register. The new password is included in the response. 
     * Regenerate Device SIP Password
     */
    async regenerateSiteDevicePasswordRaw(requestParameters: RegenerateSiteDevicePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DeviceResponseWithPassword>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling regenerateSiteDevicePassword().'
            );
        }

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

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

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

    /**
     * Generates a new random SIP password for the specified device. The old password will no longer be valid. The device will need to be updated with the new password to re-register. The new password is included in the response. 
     * Regenerate Device SIP Password
     */
    async regenerateSiteDevicePassword(requestParameters: RegenerateSiteDevicePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceResponseWithPassword> {
        const response = await this.regenerateSiteDevicePasswordRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Moves a device from its current site (specified in the path) to a new target site (specified in the request body) within the same customer account. The device configuration (apart from its site association) generally remains the same. 
     * Transfer Device to Another Site
     */
    async transferDeviceToNewSiteRaw(requestParameters: TransferDeviceToNewSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DeviceResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling transferDeviceToNewSite().'
            );
        }

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

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

        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}/devices/{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) => DeviceResponseFromJSON(jsonValue));
    }

    /**
     * Moves a device from its current site (specified in the path) to a new target site (specified in the request body) within the same customer account. The device configuration (apart from its site association) generally remains the same. 
     * Transfer Device to Another Site
     */
    async transferDeviceToNewSite(requestParameters: TransferDeviceToNewSiteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceResponse> {
        const response = await this.transferDeviceToNewSiteRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Updates the configuration for a specific device on a site. Note: The SIP password cannot be updated via this endpoint; use the dedicated regenerate-password endpoint for that. 
     * Update Device Configuration
     */
    async updateSiteDeviceByIdRaw(requestParameters: UpdateSiteDeviceByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<DeviceResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling updateSiteDeviceById().'
            );
        }

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

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

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

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

    /**
     * Updates the configuration for a specific device on a site. Note: The SIP password cannot be updated via this endpoint; use the dedicated regenerate-password endpoint for that. 
     * Update Device Configuration
     */
    async updateSiteDeviceById(requestParameters: UpdateSiteDeviceByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<DeviceResponse> {
        const response = await this.updateSiteDeviceByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
