/* 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 {
  TemplateCreateRequest,
  TemplateListResponse,
  TemplateResponse,
  TemplateUpdateRequest,
  TemplatesComponentsSchemasError,
} from '../models/index';
import {
    TemplateCreateRequestFromJSON,
    TemplateCreateRequestToJSON,
    TemplateListResponseFromJSON,
    TemplateListResponseToJSON,
    TemplateResponseFromJSON,
    TemplateResponseToJSON,
    TemplateUpdateRequestFromJSON,
    TemplateUpdateRequestToJSON,
    TemplatesComponentsSchemasErrorFromJSON,
    TemplatesComponentsSchemasErrorToJSON,
} from '../models/index';

export interface CreateTemplateRequest {
    templateCreateRequest: TemplateCreateRequest;
}

export interface DeleteTemplateByIdRequest {
    id: number;
}

export interface GetTemplateByIdRequest {
    id: number;
}

export interface ListTemplatesRequest {
    pageSize?: number;
    page?: number;
    all?: boolean;
    q?: string;
}

export interface UpdateTemplateByIdRequest {
    id: number;
    templateUpdateRequest: TemplateUpdateRequest;
}

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

    /**
     * Creates a new service template with a defined set of features and their configurations. This allows for streamlined provisioning of new users or services. 
     * Create a New Template
     */
    async createTemplateRaw(requestParameters: CreateTemplateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<TemplateResponse>> {
        if (requestParameters['templateCreateRequest'] == null) {
            throw new runtime.RequiredError(
                'templateCreateRequest',
                'Required parameter "templateCreateRequest" was null or undefined when calling createTemplate().'
            );
        }

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

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

    /**
     * Creates a new service template with a defined set of features and their configurations. This allows for streamlined provisioning of new users or services. 
     * Create a New Template
     */
    async createTemplate(requestParameters: CreateTemplateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<TemplateResponse> {
        const response = await this.createTemplateRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Permanently deletes a specific service template. This action cannot be undone.
     * Delete a Template
     */
    async deleteTemplateByIdRaw(requestParameters: DeleteTemplateByIdRequest, 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 deleteTemplateById().'
            );
        }

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

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Permanently deletes a specific service template. This action cannot be undone.
     * Delete a Template
     */
    async deleteTemplateById(requestParameters: DeleteTemplateByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.deleteTemplateByIdRaw(requestParameters, initOverrides);
    }

    /**
     * Retrieves detailed information for a specific service template by its ID.
     * Get Template Details
     */
    async getTemplateByIdRaw(requestParameters: GetTemplateByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<TemplateResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling getTemplateById().'
            );
        }

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

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

    /**
     * Retrieves detailed information for a specific service template by its ID.
     * Get Template Details
     */
    async getTemplateById(requestParameters: GetTemplateByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<TemplateResponse> {
        const response = await this.getTemplateByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves a list of service templates available to the authenticated account. Can be paginated and filtered, for example, to show all templates in the system (with `all=true`) or search by name (`q`). 
     * List Templates
     */
    async listTemplatesRaw(requestParameters: ListTemplatesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<TemplateListResponse>> {
        const queryParameters: any = {};

        if (requestParameters['pageSize'] != null) {
            queryParameters['page_size'] = requestParameters['pageSize'];
        }

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

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

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

        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: `/templates`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Retrieves a list of service templates available to the authenticated account. Can be paginated and filtered, for example, to show all templates in the system (with `all=true`) or search by name (`q`). 
     * List Templates
     */
    async listTemplates(requestParameters: ListTemplatesRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<TemplateListResponse> {
        const response = await this.listTemplatesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Updates the configuration of an existing service template.
     * Update an Existing Template
     */
    async updateTemplateByIdRaw(requestParameters: UpdateTemplateByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<TemplateResponse>> {
        if (requestParameters['id'] == null) {
            throw new runtime.RequiredError(
                'id',
                'Required parameter "id" was null or undefined when calling updateTemplateById().'
            );
        }

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

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

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

    /**
     * Updates the configuration of an existing service template.
     * Update an Existing Template
     */
    async updateTemplateById(requestParameters: UpdateTemplateByIdRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<TemplateResponse> {
        const response = await this.updateTemplateByIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
