/* 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 {
  FaxMachineCreateRequest,
  FaxMachineListResponse,
  FaxMachineResponse,
  FaxMachineUpdateRequest,
  TransferFaxMachineToNewSiteRequest,
} from '../models/index';
import {
    FaxMachineCreateRequestFromJSON,
    FaxMachineCreateRequestToJSON,
    FaxMachineListResponseFromJSON,
    FaxMachineListResponseToJSON,
    FaxMachineResponseFromJSON,
    FaxMachineResponseToJSON,
    FaxMachineUpdateRequestFromJSON,
    FaxMachineUpdateRequestToJSON,
    TransferFaxMachineToNewSiteRequestFromJSON,
    TransferFaxMachineToNewSiteRequestToJSON,
} from '../models/index';

export interface CreateSiteFaxMachineRequest {
    siteId: number;
    faxMachineCreateRequest: FaxMachineCreateRequest;
}

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

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

export interface ListSiteFaxMachinesRequest {
    siteId: number;
}

export interface TransferFaxMachineToNewSiteOperationRequest {
    siteId: number;
    id: number;
    transferFaxMachineToNewSiteRequest: TransferFaxMachineToNewSiteRequest;
}

export interface UpdateSiteFaxMachineByIdRequest {
    siteId: number;
    id: number;
    faxMachineUpdateRequest: FaxMachineUpdateRequest;
}

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

    /**
     * Adds a new fax machine (Fax to Email) configuration to the specified site. Requires a name and one or more notification email addresses where received faxes (as PDFs) will be sent. 
     * Create a Fax Machine for a Site
     */
    async createSiteFaxMachineRaw(requestParameters: CreateSiteFaxMachineRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<FaxMachineResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling createSiteFaxMachine().'
            );
        }

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

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

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

    /**
     * Adds a new fax machine (Fax to Email) configuration to the specified site. Requires a name and one or more notification email addresses where received faxes (as PDFs) will be sent. 
     * Create a Fax Machine for a Site
     */
    async createSiteFaxMachine(requestParameters: CreateSiteFaxMachineRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<FaxMachineResponse> {
        const response = await this.createSiteFaxMachineRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently deletes a specific fax machine configuration from the site.
     * Delete a Fax Machine Configuration
     */
    async deleteSiteFaxMachineByIdRaw(requestParameters: DeleteSiteFaxMachineByIdRequest, 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 deleteSiteFaxMachineById().'
            );
        }

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

        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}/fax-machines/{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 fax machine configuration from the site.
     * Delete a Fax Machine Configuration
     */
    async deleteSiteFaxMachineById(requestParameters: DeleteSiteFaxMachineByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteSiteFaxMachineByIdRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieves detailed information for a specific fax machine configuration by its ID, belonging to the specified site.
     * Get Fax Machine Details
     */
    async getSiteFaxMachineByIdRaw(requestParameters: GetSiteFaxMachineByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<FaxMachineResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling getSiteFaxMachineById().'
            );
        }

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

        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}/fax-machines/{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) => FaxMachineResponseFromJSON(jsonValue));
    }

    /**
     * Retrieves detailed information for a specific fax machine configuration by its ID, belonging to the specified site.
     * Get Fax Machine Details
     */
    async getSiteFaxMachineById(requestParameters: GetSiteFaxMachineByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<FaxMachineResponse> {
        const response = await this.getSiteFaxMachineByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves a list of all fax machine (Fax to Email) configurations for the specified site.
     * List Fax Machines for a Site
     */
    async listSiteFaxMachinesRaw(requestParameters: ListSiteFaxMachinesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<FaxMachineListResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling listSiteFaxMachines().'
            );
        }

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

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

    /**
     * Retrieves a list of all fax machine (Fax to Email) configurations for the specified site.
     * List Fax Machines for a Site
     */
    async listSiteFaxMachines(requestParameters: ListSiteFaxMachinesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<FaxMachineListResponse> {
        const response = await this.listSiteFaxMachinesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Moves a fax machine configuration from its current site (specified in the path) to a new target site (specified in the request body) within the same customer account. 
     * Transfer Fax Machine to Another Site
     */
    async transferFaxMachineToNewSiteRaw(requestParameters: TransferFaxMachineToNewSiteOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<FaxMachineResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling transferFaxMachineToNewSite().'
            );
        }

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

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

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

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

    /**
     * Moves a fax machine configuration from its current site (specified in the path) to a new target site (specified in the request body) within the same customer account. 
     * Transfer Fax Machine to Another Site
     */
    async transferFaxMachineToNewSite(requestParameters: TransferFaxMachineToNewSiteOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<FaxMachineResponse> {
        const response = await this.transferFaxMachineToNewSiteRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Updates the configuration for a specific fax machine on a site, such as its name or notification email addresses.
     * Update Fax Machine Configuration
     */
    async updateSiteFaxMachineByIdRaw(requestParameters: UpdateSiteFaxMachineByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<FaxMachineResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling updateSiteFaxMachineById().'
            );
        }

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

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

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

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

    /**
     * Updates the configuration for a specific fax machine on a site, such as its name or notification email addresses.
     * Update Fax Machine Configuration
     */
    async updateSiteFaxMachineById(requestParameters: UpdateSiteFaxMachineByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<FaxMachineResponse> {
        const response = await this.updateSiteFaxMachineByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
