/* tslint:disable */
/* eslint-disable */
/**
 * CWMS Data API
 * CWMS REST API for Data Retrieval
 *
 * The version of the OpenAPI document: 2.4.0-2026.3.16
 * 
 *
 * 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 {
    CdaError,
    CdaErrorFromJSON,
    CdaErrorToJSON,
    DatabaseLoadMethod,
    DatabaseLoadMethodFromJSON,
    DatabaseLoadMethodToJSON,
    DeleteMethod,
    DeleteMethodFromJSON,
    DeleteMethodToJSON,
    RateInputTimeSeries,
    RateInputTimeSeriesFromJSON,
    RateInputTimeSeriesToJSON,
    RateInputValues,
    RateInputValuesFromJSON,
    RateInputValuesToJSON,
    RatedOutputTimeSeries,
    RatedOutputTimeSeriesFromJSON,
    RatedOutputTimeSeriesToJSON,
    RatedOutputValues,
    RatedOutputValuesFromJSON,
    RatedOutputValuesToJSON,
    RatingEffectiveDatesMap,
    RatingEffectiveDatesMapFromJSON,
    RatingEffectiveDatesMapToJSON,
    RatingMetadataList,
    RatingMetadataListFromJSON,
    RatingMetadataListToJSON,
    RatingSpec,
    RatingSpecFromJSON,
    RatingSpecToJSON,
    RatingSpecs,
    RatingSpecsFromJSON,
    RatingSpecsToJSON,
    RatingTemplate,
    RatingTemplateFromJSON,
    RatingTemplateToJSON,
    RatingTemplates,
    RatingTemplatesFromJSON,
    RatingTemplatesToJSON,
} from '../models';

export interface DeleteRatingsSpecWithRatingIdRequest {
    ratingId: string;
    office: string;
    method: DeleteMethod;
}

export interface DeleteRatingsTemplateWithTemplateIdRequest {
    templateId: string;
    office: string;
    method: DeleteMethod;
}

export interface DeleteRatingsWithRatingIdRequest {
    ratingId: string;
    office: string;
    begin: string;
    end: string;
    timezone?: string;
}

export interface GetRatingsRequest {
    name?: string;
    office?: string;
    unit?: string;
    datum?: string;
    at?: string;
    end?: string;
    timezone?: string;
    format?: string;
}

export interface GetRatingsEffectiveDatesRequest {
    officeMask?: string;
    ratingIdMask?: string;
    timezone?: string;
    begin?: string;
    end?: string;
}

export interface GetRatingsMetadataRequest {
    office?: string;
    ratingIdMask?: string;
    start?: string;
    end?: string;
    timezone?: string;
    page?: string;
    pageSize?: number;
}

export interface GetRatingsSpecRequest {
    office?: string;
    ratingIdMask?: string;
    page?: string;
    pageSize?: number;
}

export interface GetRatingsSpecWithRatingIdRequest {
    ratingId: string;
    office: string;
}

export interface GetRatingsTemplateRequest {
    office?: string;
    templateIdMask?: string;
    page?: string;
    pageSize?: number;
}

export interface GetRatingsTemplateWithTemplateIdRequest {
    templateId: string;
    office: string;
}

export interface GetRatingsWithRatingIdRequest {
    ratingId: string;
    office: string;
    begin?: string;
    end?: string;
    timezone?: string;
    method?: DatabaseLoadMethod;
}

export interface GetRatingsWithRatingIdLatestRequest {
    ratingId: string;
    office: string;
}

export interface PatchRatingsWithRatingIdRequest {
    ratingId: string;
    body: object;
    storeTemplate?: boolean;
    replaceBaseCurve?: boolean;
}

export interface PostRatingsRequest {
    body: object;
    storeTemplate?: boolean;
}

export interface PostRatingsRateTsWithOfficeWithRatingIdRequest {
    office: string;
    ratingId: string;
    rateInputTimeSeries: RateInputTimeSeries;
}

export interface PostRatingsRateValuesWithOfficeWithRatingIdRequest {
    office: string;
    ratingId: string;
    rateInputValues: RateInputValues;
}

export interface PostRatingsReverseRateTsWithOfficeWithRatingIdRequest {
    office: string;
    ratingId: string;
    rateInputTimeSeries: RateInputTimeSeries;
}

export interface PostRatingsReverseRateValuesWithOfficeWithRatingIdRequest {
    office: string;
    ratingId: string;
    rateInputValues: RateInputValues;
}

export interface PostRatingsSpecRequest {
    ratingSpec: RatingSpec;
    failIfExists?: boolean;
}

export interface PostRatingsTemplateRequest {
    ratingTemplate: RatingTemplate;
    failIfExists?: boolean;
}

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

    /**
     * Deletes requested rating specification
     * Delete ratings spec with ratingId
     */
    async deleteRatingsSpecWithRatingIdRaw(requestParameters: DeleteRatingsSpecWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling deleteRatingsSpecWithRatingId.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling deleteRatingsSpecWithRatingId.');
        }

        if (requestParameters.method === null || requestParameters.method === undefined) {
            throw new runtime.RequiredError('method','Required parameter requestParameters.method was null or undefined when calling deleteRatingsSpecWithRatingId.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.method !== undefined) {
            queryParameters['method'] = requestParameters.method;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/spec/{rating-id}`.replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Deletes requested rating specification
     * Delete ratings spec with ratingId
     */
    async deleteRatingsSpecWithRatingId(requestParameters: DeleteRatingsSpecWithRatingIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.deleteRatingsSpecWithRatingIdRaw(requestParameters, initOverrides);
    }

    /**
     * Deletes requested rating specification
     * Delete ratings template with templateId
     */
    async deleteRatingsTemplateWithTemplateIdRaw(requestParameters: DeleteRatingsTemplateWithTemplateIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.templateId === null || requestParameters.templateId === undefined) {
            throw new runtime.RequiredError('templateId','Required parameter requestParameters.templateId was null or undefined when calling deleteRatingsTemplateWithTemplateId.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling deleteRatingsTemplateWithTemplateId.');
        }

        if (requestParameters.method === null || requestParameters.method === undefined) {
            throw new runtime.RequiredError('method','Required parameter requestParameters.method was null or undefined when calling deleteRatingsTemplateWithTemplateId.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.method !== undefined) {
            queryParameters['method'] = requestParameters.method;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/template/{template-id}`.replace(`{${"template-id"}}`, encodeURIComponent(String(requestParameters.templateId))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Deletes requested rating specification
     * Delete ratings template with templateId
     */
    async deleteRatingsTemplateWithTemplateId(requestParameters: DeleteRatingsTemplateWithTemplateIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.deleteRatingsTemplateWithTemplateIdRaw(requestParameters, initOverrides);
    }

    /**
     * Delete ratings with ratingId
     */
    async deleteRatingsWithRatingIdRaw(requestParameters: DeleteRatingsWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling deleteRatingsWithRatingId.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling deleteRatingsWithRatingId.');
        }

        if (requestParameters.begin === null || requestParameters.begin === undefined) {
            throw new runtime.RequiredError('begin','Required parameter requestParameters.begin was null or undefined when calling deleteRatingsWithRatingId.');
        }

        if (requestParameters.end === null || requestParameters.end === undefined) {
            throw new runtime.RequiredError('end','Required parameter requestParameters.end was null or undefined when calling deleteRatingsWithRatingId.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.begin !== undefined) {
            queryParameters['begin'] = requestParameters.begin;
        }

        if (requestParameters.end !== undefined) {
            queryParameters['end'] = requestParameters.end;
        }

        if (requestParameters.timezone !== undefined) {
            queryParameters['timezone'] = requestParameters.timezone;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/{rating-id}`.replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete ratings with ratingId
     */
    async deleteRatingsWithRatingId(requestParameters: DeleteRatingsWithRatingIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.deleteRatingsWithRatingIdRaw(requestParameters, initOverrides);
    }

    /**
     * Get ratings
     */
    async getRatingsRaw(requestParameters: GetRatingsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<object>> {
        const queryParameters: any = {};

        if (requestParameters.name !== undefined) {
            queryParameters['name'] = requestParameters.name;
        }

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.unit !== undefined) {
            queryParameters['unit'] = requestParameters.unit;
        }

        if (requestParameters.datum !== undefined) {
            queryParameters['datum'] = requestParameters.datum;
        }

        if (requestParameters.at !== undefined) {
            queryParameters['at'] = requestParameters.at;
        }

        if (requestParameters.end !== undefined) {
            queryParameters['end'] = requestParameters.end;
        }

        if (requestParameters.timezone !== undefined) {
            queryParameters['timezone'] = requestParameters.timezone;
        }

        if (requestParameters.format !== undefined) {
            queryParameters['format'] = requestParameters.format;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse<any>(response);
    }

    /**
     * Get ratings
     */
    async getRatings(requestParameters: GetRatingsRequest = {}, initOverrides?: RequestInit): Promise<object> {
        const response = await this.getRatingsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Returns mapping of office -> spec id -> effective date-times for all matching offices and spec ids.
     * Get ratings effectiveDates
     */
    async getRatingsEffectiveDatesRaw(requestParameters: GetRatingsEffectiveDatesRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatingEffectiveDatesMap>> {
        const queryParameters: any = {};

        if (requestParameters.officeMask !== undefined) {
            queryParameters['office-mask'] = requestParameters.officeMask;
        }

        if (requestParameters.ratingIdMask !== undefined) {
            queryParameters['rating-id-mask'] = requestParameters.ratingIdMask;
        }

        if (requestParameters.timezone !== undefined) {
            queryParameters['timezone'] = requestParameters.timezone;
        }

        if (requestParameters.begin !== undefined) {
            queryParameters['begin'] = requestParameters.begin;
        }

        if (requestParameters.end !== undefined) {
            queryParameters['end'] = requestParameters.end;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/effective-dates`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Returns mapping of office -> spec id -> effective date-times for all matching offices and spec ids.
     * Get ratings effectiveDates
     */
    async getRatingsEffectiveDates(requestParameters: GetRatingsEffectiveDatesRequest = {}, initOverrides?: RequestInit): Promise<RatingEffectiveDatesMap> {
        const response = await this.getRatingsEffectiveDatesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get ratings metadata
     */
    async getRatingsMetadataRaw(requestParameters: GetRatingsMetadataRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatingMetadataList>> {
        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.ratingIdMask !== undefined) {
            queryParameters['rating-id-mask'] = requestParameters.ratingIdMask;
        }

        if (requestParameters.start !== undefined) {
            queryParameters['start'] = requestParameters.start;
        }

        if (requestParameters.end !== undefined) {
            queryParameters['end'] = requestParameters.end;
        }

        if (requestParameters.timezone !== undefined) {
            queryParameters['timezone'] = requestParameters.timezone;
        }

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

        if (requestParameters.pageSize !== undefined) {
            queryParameters['page-size'] = requestParameters.pageSize;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/metadata`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get ratings metadata
     */
    async getRatingsMetadata(requestParameters: GetRatingsMetadataRequest = {}, initOverrides?: RequestInit): Promise<RatingMetadataList> {
        const response = await this.getRatingsMetadataRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get ratings spec
     */
    async getRatingsSpecRaw(requestParameters: GetRatingsSpecRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatingSpecs>> {
        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.ratingIdMask !== undefined) {
            queryParameters['rating-id-mask'] = requestParameters.ratingIdMask;
        }

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

        if (requestParameters.pageSize !== undefined) {
            queryParameters['page-size'] = requestParameters.pageSize;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/spec`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get ratings spec
     */
    async getRatingsSpec(requestParameters: GetRatingsSpecRequest = {}, initOverrides?: RequestInit): Promise<RatingSpecs> {
        const response = await this.getRatingsSpecRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get ratings spec with ratingId
     */
    async getRatingsSpecWithRatingIdRaw(requestParameters: GetRatingsSpecWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatingSpec>> {
        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling getRatingsSpecWithRatingId.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling getRatingsSpecWithRatingId.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/spec/{rating-id}`.replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get ratings spec with ratingId
     */
    async getRatingsSpecWithRatingId(requestParameters: GetRatingsSpecWithRatingIdRequest, initOverrides?: RequestInit): Promise<RatingSpec> {
        const response = await this.getRatingsSpecWithRatingIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get ratings template
     */
    async getRatingsTemplateRaw(requestParameters: GetRatingsTemplateRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatingTemplates>> {
        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.templateIdMask !== undefined) {
            queryParameters['template-id-mask'] = requestParameters.templateIdMask;
        }

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

        if (requestParameters.pageSize !== undefined) {
            queryParameters['page-size'] = requestParameters.pageSize;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/template`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get ratings template
     */
    async getRatingsTemplate(requestParameters: GetRatingsTemplateRequest = {}, initOverrides?: RequestInit): Promise<RatingTemplates> {
        const response = await this.getRatingsTemplateRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get ratings template with templateId
     */
    async getRatingsTemplateWithTemplateIdRaw(requestParameters: GetRatingsTemplateWithTemplateIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<Array<RatingTemplate>>> {
        if (requestParameters.templateId === null || requestParameters.templateId === undefined) {
            throw new runtime.RequiredError('templateId','Required parameter requestParameters.templateId was null or undefined when calling getRatingsTemplateWithTemplateId.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling getRatingsTemplateWithTemplateId.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/template/{template-id}`.replace(`{${"template-id"}}`, encodeURIComponent(String(requestParameters.templateId))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

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

    /**
     * Get ratings template with templateId
     */
    async getRatingsTemplateWithTemplateId(requestParameters: GetRatingsTemplateWithTemplateIdRequest, initOverrides?: RequestInit): Promise<Array<RatingTemplate>> {
        const response = await this.getRatingsTemplateWithTemplateIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Returns CWMS Rating Data. Supports accept header formatting. For more information about accept header usage, <a href=\"legacy-format/\">see this page.</a>
     * Get ratings with ratingId
     */
    async getRatingsWithRatingIdRaw(requestParameters: GetRatingsWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<object>> {
        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling getRatingsWithRatingId.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling getRatingsWithRatingId.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        if (requestParameters.begin !== undefined) {
            queryParameters['begin'] = requestParameters.begin;
        }

        if (requestParameters.end !== undefined) {
            queryParameters['end'] = requestParameters.end;
        }

        if (requestParameters.timezone !== undefined) {
            queryParameters['timezone'] = requestParameters.timezone;
        }

        if (requestParameters.method !== undefined) {
            queryParameters['method'] = requestParameters.method;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/{rating-id}`.replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse<any>(response);
    }

    /**
     * Returns CWMS Rating Data. Supports accept header formatting. For more information about accept header usage, <a href=\"legacy-format/\">see this page.</a>
     * Get ratings with ratingId
     */
    async getRatingsWithRatingId(requestParameters: GetRatingsWithRatingIdRequest, initOverrides?: RequestInit): Promise<object> {
        const response = await this.getRatingsWithRatingIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Returns CWMS Rating Data
     * Get ratings with ratingId latest
     */
    async getRatingsWithRatingIdLatestRaw(requestParameters: GetRatingsWithRatingIdLatestRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<object>> {
        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling getRatingsWithRatingIdLatest.');
        }

        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling getRatingsWithRatingIdLatest.');
        }

        const queryParameters: any = {};

        if (requestParameters.office !== undefined) {
            queryParameters['office'] = requestParameters.office;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/{rating-id}/latest`.replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse<any>(response);
    }

    /**
     * Returns CWMS Rating Data
     * Get ratings with ratingId latest
     */
    async getRatingsWithRatingIdLatest(requestParameters: GetRatingsWithRatingIdLatestRequest, initOverrides?: RequestInit): Promise<object> {
        const response = await this.getRatingsWithRatingIdLatestRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Update a RatingSet
     * Patch ratings with ratingId
     */
    async patchRatingsWithRatingIdRaw(requestParameters: PatchRatingsWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling patchRatingsWithRatingId.');
        }

        if (requestParameters.body === null || requestParameters.body === undefined) {
            throw new runtime.RequiredError('body','Required parameter requestParameters.body was null or undefined when calling patchRatingsWithRatingId.');
        }

        const queryParameters: any = {};

        if (requestParameters.storeTemplate !== undefined) {
            queryParameters['store-template'] = requestParameters.storeTemplate;
        }

        if (requestParameters.replaceBaseCurve !== undefined) {
            queryParameters['replace-base-curve'] = requestParameters.replaceBaseCurve;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/xml;version=2';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/{rating-id}`.replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: requestParameters.body as any,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Update a RatingSet
     * Patch ratings with ratingId
     */
    async patchRatingsWithRatingId(requestParameters: PatchRatingsWithRatingIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.patchRatingsWithRatingIdRaw(requestParameters, initOverrides);
    }

    /**
     * Create new RatingSet
     * Post ratings
     */
    async postRatingsRaw(requestParameters: PostRatingsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.body === null || requestParameters.body === undefined) {
            throw new runtime.RequiredError('body','Required parameter requestParameters.body was null or undefined when calling postRatings.');
        }

        const queryParameters: any = {};

        if (requestParameters.storeTemplate !== undefined) {
            queryParameters['store-template'] = requestParameters.storeTemplate;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/xml;version=2';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: requestParameters.body as any,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Create new RatingSet
     * Post ratings
     */
    async postRatings(requestParameters: PostRatingsRequest, initOverrides?: RequestInit): Promise<void> {
        await this.postRatingsRaw(requestParameters, initOverrides);
    }

    /**
     * Rates input values using CWMS ratings. The input format `RateInputTimeSeries` DTO supports an array of CWMS time series ids, each corresponding to an independent parameter in the rating curve.The output format `RatedOutputTimeSeries` will contain a singular double array corresponding to the dependent parameter of the rating curve. 
     * Post ratings rateTs with office with ratingId
     */
    async postRatingsRateTsWithOfficeWithRatingIdRaw(requestParameters: PostRatingsRateTsWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatedOutputTimeSeries>> {
        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling postRatingsRateTsWithOfficeWithRatingId.');
        }

        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling postRatingsRateTsWithOfficeWithRatingId.');
        }

        if (requestParameters.rateInputTimeSeries === null || requestParameters.rateInputTimeSeries === undefined) {
            throw new runtime.RequiredError('rateInputTimeSeries','Required parameter requestParameters.rateInputTimeSeries was null or undefined when calling postRatingsRateTsWithOfficeWithRatingId.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/rate-ts/{office}/{rating-id}`.replace(`{${"office"}}`, encodeURIComponent(String(requestParameters.office))).replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: RateInputTimeSeriesToJSON(requestParameters.rateInputTimeSeries),
        }, initOverrides);

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

    /**
     * Rates input values using CWMS ratings. The input format `RateInputTimeSeries` DTO supports an array of CWMS time series ids, each corresponding to an independent parameter in the rating curve.The output format `RatedOutputTimeSeries` will contain a singular double array corresponding to the dependent parameter of the rating curve. 
     * Post ratings rateTs with office with ratingId
     */
    async postRatingsRateTsWithOfficeWithRatingId(requestParameters: PostRatingsRateTsWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<RatedOutputTimeSeries> {
        const response = await this.postRatingsRateTsWithOfficeWithRatingIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Rates input values using CWMS ratings. The input format `RatingInputValues` includes a two dimensional array with each dimension corresponding to an independent parameter in the rating curve. The output format `RatedOutputTimeSeries` will contain a singular double array corresponding to the dependent parameter of the rating curve. 
     * Post ratings rateValues with office with ratingId
     */
    async postRatingsRateValuesWithOfficeWithRatingIdRaw(requestParameters: PostRatingsRateValuesWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatedOutputValues>> {
        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling postRatingsRateValuesWithOfficeWithRatingId.');
        }

        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling postRatingsRateValuesWithOfficeWithRatingId.');
        }

        if (requestParameters.rateInputValues === null || requestParameters.rateInputValues === undefined) {
            throw new runtime.RequiredError('rateInputValues','Required parameter requestParameters.rateInputValues was null or undefined when calling postRatingsRateValuesWithOfficeWithRatingId.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/rate-values/{office}/{rating-id}`.replace(`{${"office"}}`, encodeURIComponent(String(requestParameters.office))).replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: RateInputValuesToJSON(requestParameters.rateInputValues),
        }, initOverrides);

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

    /**
     * Rates input values using CWMS ratings. The input format `RatingInputValues` includes a two dimensional array with each dimension corresponding to an independent parameter in the rating curve. The output format `RatedOutputTimeSeries` will contain a singular double array corresponding to the dependent parameter of the rating curve. 
     * Post ratings rateValues with office with ratingId
     */
    async postRatingsRateValuesWithOfficeWithRatingId(requestParameters: PostRatingsRateValuesWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<RatedOutputValues> {
        const response = await this.postRatingsRateValuesWithOfficeWithRatingIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Reverse rates input values using CWMS ratings. The input format `RateInputTimeSeries` requires a singular time series id corresponding to the dependent parameter in the rating curve. The output format `RatedOutputTimeSeries` will contain a singular double array corresponding to the independent parameter of the rating curve. Note: This endpoint only works on monotonically increase/decreasing table ratings with a single independent parameter.
     * Post ratings reverseRateTs with office with ratingId
     */
    async postRatingsReverseRateTsWithOfficeWithRatingIdRaw(requestParameters: PostRatingsReverseRateTsWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatedOutputTimeSeries>> {
        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling postRatingsReverseRateTsWithOfficeWithRatingId.');
        }

        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling postRatingsReverseRateTsWithOfficeWithRatingId.');
        }

        if (requestParameters.rateInputTimeSeries === null || requestParameters.rateInputTimeSeries === undefined) {
            throw new runtime.RequiredError('rateInputTimeSeries','Required parameter requestParameters.rateInputTimeSeries was null or undefined when calling postRatingsReverseRateTsWithOfficeWithRatingId.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/reverse-rate-ts/{office}/{rating-id}`.replace(`{${"office"}}`, encodeURIComponent(String(requestParameters.office))).replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: RateInputTimeSeriesToJSON(requestParameters.rateInputTimeSeries),
        }, initOverrides);

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

    /**
     * Reverse rates input values using CWMS ratings. The input format `RateInputTimeSeries` requires a singular time series id corresponding to the dependent parameter in the rating curve. The output format `RatedOutputTimeSeries` will contain a singular double array corresponding to the independent parameter of the rating curve. Note: This endpoint only works on monotonically increase/decreasing table ratings with a single independent parameter.
     * Post ratings reverseRateTs with office with ratingId
     */
    async postRatingsReverseRateTsWithOfficeWithRatingId(requestParameters: PostRatingsReverseRateTsWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<RatedOutputTimeSeries> {
        const response = await this.postRatingsReverseRateTsWithOfficeWithRatingIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Reverse rates input values using CWMS ratings. The input format `RateInputValues` requires a singular array of doubles corresponding to the dependent parameter in the rating curve. The output format `RatedOutputValues` will contain a singular double array corresponding to the independent parameter of the rating curve. Note: This endpoint only works on monotonically increase/decreasing table ratings with a single independent parameter.
     * Post ratings reverseRateValues with office with ratingId
     */
    async postRatingsReverseRateValuesWithOfficeWithRatingIdRaw(requestParameters: PostRatingsReverseRateValuesWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<RatedOutputValues>> {
        if (requestParameters.office === null || requestParameters.office === undefined) {
            throw new runtime.RequiredError('office','Required parameter requestParameters.office was null or undefined when calling postRatingsReverseRateValuesWithOfficeWithRatingId.');
        }

        if (requestParameters.ratingId === null || requestParameters.ratingId === undefined) {
            throw new runtime.RequiredError('ratingId','Required parameter requestParameters.ratingId was null or undefined when calling postRatingsReverseRateValuesWithOfficeWithRatingId.');
        }

        if (requestParameters.rateInputValues === null || requestParameters.rateInputValues === undefined) {
            throw new runtime.RequiredError('rateInputValues','Required parameter requestParameters.rateInputValues was null or undefined when calling postRatingsReverseRateValuesWithOfficeWithRatingId.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/reverse-rate-values/{office}/{rating-id}`.replace(`{${"office"}}`, encodeURIComponent(String(requestParameters.office))).replace(`{${"rating-id"}}`, encodeURIComponent(String(requestParameters.ratingId))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: RateInputValuesToJSON(requestParameters.rateInputValues),
        }, initOverrides);

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

    /**
     * Reverse rates input values using CWMS ratings. The input format `RateInputValues` requires a singular array of doubles corresponding to the dependent parameter in the rating curve. The output format `RatedOutputValues` will contain a singular double array corresponding to the independent parameter of the rating curve. Note: This endpoint only works on monotonically increase/decreasing table ratings with a single independent parameter.
     * Post ratings reverseRateValues with office with ratingId
     */
    async postRatingsReverseRateValuesWithOfficeWithRatingId(requestParameters: PostRatingsReverseRateValuesWithOfficeWithRatingIdRequest, initOverrides?: RequestInit): Promise<RatedOutputValues> {
        const response = await this.postRatingsReverseRateValuesWithOfficeWithRatingIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Create new Rating Specification
     * Post ratings spec
     */
    async postRatingsSpecRaw(requestParameters: PostRatingsSpecRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.ratingSpec === null || requestParameters.ratingSpec === undefined) {
            throw new runtime.RequiredError('ratingSpec','Required parameter requestParameters.ratingSpec was null or undefined when calling postRatingsSpec.');
        }

        const queryParameters: any = {};

        if (requestParameters.failIfExists !== undefined) {
            queryParameters['fail-if-exists'] = requestParameters.failIfExists;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/xml;version=2';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/spec`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: RatingSpecToJSON(requestParameters.ratingSpec),
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Create new Rating Specification
     * Post ratings spec
     */
    async postRatingsSpec(requestParameters: PostRatingsSpecRequest, initOverrides?: RequestInit): Promise<void> {
        await this.postRatingsSpecRaw(requestParameters, initOverrides);
    }

    /**
     * Create new Rating Template
     * Post ratings template
     */
    async postRatingsTemplateRaw(requestParameters: PostRatingsTemplateRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.ratingTemplate === null || requestParameters.ratingTemplate === undefined) {
            throw new runtime.RequiredError('ratingTemplate','Required parameter requestParameters.ratingTemplate was null or undefined when calling postRatingsTemplate.');
        }

        const queryParameters: any = {};

        if (requestParameters.failIfExists !== undefined) {
            queryParameters['fail-if-exists'] = requestParameters.failIfExists;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/xml;version=2';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // ApiKey authentication
        }

        const response = await this.request({
            path: `/ratings/template`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: RatingTemplateToJSON(requestParameters.ratingTemplate),
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Create new Rating Template
     * Post ratings template
     */
    async postRatingsTemplate(requestParameters: PostRatingsTemplateRequest, initOverrides?: RequestInit): Promise<void> {
        await this.postRatingsTemplateRaw(requestParameters, initOverrides);
    }

}
