/* 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 {
  ForwardListResponse,
  ForwardRequest,
  ForwardResponse,
  TransferSiteForwardRequest,
} from '../models/index';
import {
    ForwardListResponseFromJSON,
    ForwardListResponseToJSON,
    ForwardRequestFromJSON,
    ForwardRequestToJSON,
    ForwardResponseFromJSON,
    ForwardResponseToJSON,
    TransferSiteForwardRequestFromJSON,
    TransferSiteForwardRequestToJSON,
} from '../models/index';

export interface CreateSiteForwardRequest {
    siteId: number;
    forwardRequest: ForwardRequest;
}

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

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

export interface ListSiteForwardsRequest {
    siteId: number;
}

export interface TransferSiteForwardOperationRequest {
    siteId: number;
    id: number;
    transferSiteForwardRequest: TransferSiteForwardRequest;
}

export interface UpdateSiteForwardByIdRequest {
    siteId: number;
    id: number;
    forwardRequest: ForwardRequest;
}

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

    /**
     * Add a new call forward to your site.
     * Create Forward for a Site
     */
    async createSiteForwardRaw(requestParameters: CreateSiteForwardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ForwardResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling createSiteForward().'
            );
        }

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

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

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

    /**
     * Add a new call forward to your site.
     * Create Forward for a Site
     */
    async createSiteForward(requestParameters: CreateSiteForwardRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ForwardResponse> {
        const response = await this.createSiteForwardRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently delete a specific call forward for a site.
     * Delete Site Forward
     */
    async deleteSiteForwardByIdRaw(requestParameters: DeleteSiteForwardByIdRequest, 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 deleteSiteForwardById().'
            );
        }

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

        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}/forwards/{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 delete a specific call forward for a site.
     * Delete Site Forward
     */
    async deleteSiteForwardById(requestParameters: DeleteSiteForwardByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteSiteForwardByIdRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieve the details of a specific call forward for a site.
     * Get Site Forward Details
     */
    async getSiteForwardByIdRaw(requestParameters: GetSiteForwardByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ForwardResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling getSiteForwardById().'
            );
        }

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

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

    /**
     * Retrieve the details of a specific call forward for a site.
     * Get Site Forward Details
     */
    async getSiteForwardById(requestParameters: GetSiteForwardByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ForwardResponse> {
        const response = await this.getSiteForwardByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieve a paginated list of all call forwards that belong to a site.
     * List Forwards for a Site
     */
    async listSiteForwardsRaw(requestParameters: ListSiteForwardsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ForwardListResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling listSiteForwards().'
            );
        }

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

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

    /**
     * Retrieve a paginated list of all call forwards that belong to a site.
     * List Forwards for a Site
     */
    async listSiteForwards(requestParameters: ListSiteForwardsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ForwardListResponse> {
        const response = await this.listSiteForwardsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Transfer a call forward to a different site.
     * Transfer Site Forward
     */
    async transferSiteForwardRaw(requestParameters: TransferSiteForwardOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ForwardResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling transferSiteForward().'
            );
        }

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

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

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

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

    /**
     * Transfer a call forward to a different site.
     * Transfer Site Forward
     */
    async transferSiteForward(requestParameters: TransferSiteForwardOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ForwardResponse> {
        const response = await this.transferSiteForwardRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Update an existing call forward for a site. Provide only fields to be changed.
     * Update Site Forward
     */
    async updateSiteForwardByIdRaw(requestParameters: UpdateSiteForwardByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<ForwardResponse>> {
        if (requestParameters['siteId'] == null) {
            throw new runtime.RequiredError(
                'siteId',
                'Required parameter "siteId" was null or undefined when calling updateSiteForwardById().'
            );
        }

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

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

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

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

    /**
     * Update an existing call forward for a site. Provide only fields to be changed.
     * Update Site Forward
     */
    async updateSiteForwardById(requestParameters: UpdateSiteForwardByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<ForwardResponse> {
        const response = await this.updateSiteForwardByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
