/* 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,
    LocationLevel,
    LocationLevelFromJSON,
    LocationLevelToJSON,
    LocationLevels,
    LocationLevelsFromJSON,
    LocationLevelsToJSON,
    SpecifiedLevel,
    SpecifiedLevelFromJSON,
    SpecifiedLevelToJSON,
    TimeSeries,
    TimeSeriesFromJSON,
    TimeSeriesToJSON,
} from '../models';

export interface DeleteLevelsWithLevelIdRequest {
    levelId: string;
    cascadeDelete?: boolean;
    office?: string;
    effectiveDate?: string;
    timezone?: string;
}

export interface DeleteSpecifiedLevelsWithSpecifiedLevelIdRequest {
    specifiedLevelId: string;
    office: string;
}

export interface GetLevelsRequest {
    levelIdMask?: string;
    office?: string;
    unit?: string;
    datum?: string;
    begin?: string;
    end?: string;
    timezone?: string;
    format?: string;
    includeAliases?: boolean;
    page?: string;
    pageSize?: number;
}

export interface GetLevelsWithLevelIdRequest {
    levelId: string;
    office: string;
    effectiveDate: string;
    useExactEffectiveDate?: boolean;
    timezone?: string;
    unit?: string;
}

export interface GetLevelsWithLevelIdTimeSeriesRequest {
    levelId: string;
    office: string;
    unit: string;
    interval?: string;
    begin?: string;
    end?: string;
    timezone?: string;
}

export interface GetSpecifiedLevelsRequest {
    office?: string;
    templateIdMask?: string;
}

export interface PatchLevelsWithLevelIdRequest {
    levelId: string;
    locationLevel: LocationLevel;
    effectiveDate?: string;
}

export interface PatchSpecifiedLevelsWithSpecifiedLevelIdRequest {
    specifiedLevelId: string;
    specifiedLevelId2: string;
    office: string;
}

export interface PostLevelsRequest {
    locationLevel: LocationLevel;
}

export interface PostSpecifiedLevelsRequest {
    specifiedLevel: SpecifiedLevel;
    failIfExists?: boolean;
}

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

    /**
     * Delete CWMS Location Level
     * Delete levels with levelId
     */
    async deleteLevelsWithLevelIdRaw(requestParameters: DeleteLevelsWithLevelIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.levelId === null || requestParameters.levelId === undefined) {
            throw new runtime.RequiredError('levelId','Required parameter requestParameters.levelId was null or undefined when calling deleteLevelsWithLevelId.');
        }

        const queryParameters: any = {};

        if (requestParameters.cascadeDelete !== undefined) {
            queryParameters['cascade-delete'] = requestParameters.cascadeDelete;
        }

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

        if (requestParameters.effectiveDate !== undefined) {
            queryParameters['effective-date'] = requestParameters.effectiveDate;
        }

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

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Delete CWMS Location Level
     * Delete levels with levelId
     */
    async deleteLevelsWithLevelId(requestParameters: DeleteLevelsWithLevelIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.deleteLevelsWithLevelIdRaw(requestParameters, initOverrides);
    }

    /**
     * Deletes requested specified level id
     * Delete specifiedLevels with specifiedLevelId
     */
    async deleteSpecifiedLevelsWithSpecifiedLevelIdRaw(requestParameters: DeleteSpecifiedLevelsWithSpecifiedLevelIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.specifiedLevelId === null || requestParameters.specifiedLevelId === undefined) {
            throw new runtime.RequiredError('specifiedLevelId','Required parameter requestParameters.specifiedLevelId was null or undefined when calling deleteSpecifiedLevelsWithSpecifiedLevelId.');
        }

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

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

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Deletes requested specified level id
     * Delete specifiedLevels with specifiedLevelId
     */
    async deleteSpecifiedLevelsWithSpecifiedLevelId(requestParameters: DeleteSpecifiedLevelsWithSpecifiedLevelIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.deleteSpecifiedLevelsWithSpecifiedLevelIdRaw(requestParameters, initOverrides);
    }

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

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

        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.begin !== undefined) {
            queryParameters['begin'] = requestParameters.begin;
        }

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

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

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

        if (requestParameters.includeAliases !== undefined) {
            queryParameters['include-aliases'] = requestParameters.includeAliases;
        }

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

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

    /**
     * Get levels
     */
    async getLevels(requestParameters: GetLevelsRequest = {}, initOverrides?: RequestInit): Promise<object> {
        const response = await this.getLevelsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves requested Location Level
     * Get levels with levelId
     */
    async getLevelsWithLevelIdRaw(requestParameters: GetLevelsWithLevelIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<LocationLevel>> {
        if (requestParameters.levelId === null || requestParameters.levelId === undefined) {
            throw new runtime.RequiredError('levelId','Required parameter requestParameters.levelId was null or undefined when calling getLevelsWithLevelId.');
        }

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

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

        const queryParameters: any = {};

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

        if (requestParameters.effectiveDate !== undefined) {
            queryParameters['effective-date'] = requestParameters.effectiveDate;
        }

        if (requestParameters.useExactEffectiveDate !== undefined) {
            queryParameters['use-exact-effective-date'] = requestParameters.useExactEffectiveDate;
        }

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

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

        const headerParameters: runtime.HTTPHeaders = {};

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

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

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

    /**
     * Retrieves requested Location Level
     * Get levels with levelId
     */
    async getLevelsWithLevelId(requestParameters: GetLevelsWithLevelIdRequest, initOverrides?: RequestInit): Promise<LocationLevel> {
        const response = await this.getLevelsWithLevelIdRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Retrieves requested Location Level
     * Get levels with levelId timeseries
     */
    async getLevelsWithLevelIdTimeSeriesRaw(requestParameters: GetLevelsWithLevelIdTimeSeriesRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<TimeSeries>> {
        if (requestParameters.levelId === null || requestParameters.levelId === undefined) {
            throw new runtime.RequiredError('levelId','Required parameter requestParameters.levelId was null or undefined when calling getLevelsWithLevelIdTimeSeries.');
        }

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

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

        const queryParameters: any = {};

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

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

        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.unit !== undefined) {
            queryParameters['unit'] = requestParameters.unit;
        }

        const headerParameters: runtime.HTTPHeaders = {};

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

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

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

    /**
     * Retrieves requested Location Level
     * Get levels with levelId timeseries
     */
    async getLevelsWithLevelIdTimeSeries(requestParameters: GetLevelsWithLevelIdTimeSeriesRequest, initOverrides?: RequestInit): Promise<TimeSeries> {
        const response = await this.getLevelsWithLevelIdTimeSeriesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get specifiedLevels
     */
    async getSpecifiedLevelsRaw(requestParameters: GetSpecifiedLevelsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<SpecifiedLevel>> {
        const queryParameters: any = {};

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

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

        const headerParameters: runtime.HTTPHeaders = {};

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

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

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

    /**
     * Get specifiedLevels
     */
    async getSpecifiedLevels(requestParameters: GetSpecifiedLevelsRequest = {}, initOverrides?: RequestInit): Promise<SpecifiedLevel> {
        const response = await this.getSpecifiedLevelsRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Update CWMS Location Level
     * Patch levels with levelId
     */
    async patchLevelsWithLevelIdRaw(requestParameters: PatchLevelsWithLevelIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.levelId === null || requestParameters.levelId === undefined) {
            throw new runtime.RequiredError('levelId','Required parameter requestParameters.levelId was null or undefined when calling patchLevelsWithLevelId.');
        }

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

        const queryParameters: any = {};

        if (requestParameters.effectiveDate !== undefined) {
            queryParameters['effective-date'] = requestParameters.effectiveDate;
        }

        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: `/levels/{level-id}`.replace(`{${"level-id"}}`, encodeURIComponent(String(requestParameters.levelId))),
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
            body: LocationLevelToJSON(requestParameters.locationLevel),
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Update CWMS Location Level
     * Patch levels with levelId
     */
    async patchLevelsWithLevelId(requestParameters: PatchLevelsWithLevelIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.patchLevelsWithLevelIdRaw(requestParameters, initOverrides);
    }

    /**
     * Renames the requested specified level id
     * Patch specifiedLevels with specifiedLevelId
     */
    async patchSpecifiedLevelsWithSpecifiedLevelIdRaw(requestParameters: PatchSpecifiedLevelsWithSpecifiedLevelIdRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.specifiedLevelId === null || requestParameters.specifiedLevelId === undefined) {
            throw new runtime.RequiredError('specifiedLevelId','Required parameter requestParameters.specifiedLevelId was null or undefined when calling patchSpecifiedLevelsWithSpecifiedLevelId.');
        }

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

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

        const queryParameters: any = {};

        if (requestParameters.specifiedLevelId2 !== undefined) {
            queryParameters['specified-level-id'] = requestParameters.specifiedLevelId2;
        }

        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: `/specified-levels/{specified-level-id}`.replace(`{${"specified-level-id"}}`, encodeURIComponent(String(requestParameters.specifiedLevelId))),
            method: 'PATCH',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Renames the requested specified level id
     * Patch specifiedLevels with specifiedLevelId
     */
    async patchSpecifiedLevelsWithSpecifiedLevelId(requestParameters: PatchSpecifiedLevelsWithSpecifiedLevelIdRequest, initOverrides?: RequestInit): Promise<void> {
        await this.patchSpecifiedLevelsWithSpecifiedLevelIdRaw(requestParameters, initOverrides);
    }

    /**
     * Create new CWMS Location Level
     * Post levels
     */
    async postLevelsRaw(requestParameters: PostLevelsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.locationLevel === null || requestParameters.locationLevel === undefined) {
            throw new runtime.RequiredError('locationLevel','Required parameter requestParameters.locationLevel was null or undefined when calling postLevels.');
        }

        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: `/levels`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: LocationLevelToJSON(requestParameters.locationLevel),
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Create new CWMS Location Level
     * Post levels
     */
    async postLevels(requestParameters: PostLevelsRequest, initOverrides?: RequestInit): Promise<void> {
        await this.postLevelsRaw(requestParameters, initOverrides);
    }

    /**
     * Create new SpecifiedLevel
     * Post specifiedLevels
     */
    async postSpecifiedLevelsRaw(requestParameters: PostSpecifiedLevelsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.specifiedLevel === null || requestParameters.specifiedLevel === undefined) {
            throw new runtime.RequiredError('specifiedLevel','Required parameter requestParameters.specifiedLevel was null or undefined when calling postSpecifiedLevels.');
        }

        const queryParameters: any = {};

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

        const headerParameters: runtime.HTTPHeaders = {};

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

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

        const response = await this.request({
            path: `/specified-levels`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: SpecifiedLevelToJSON(requestParameters.specifiedLevel),
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Create new SpecifiedLevel
     * Post specifiedLevels
     */
    async postSpecifiedLevels(requestParameters: PostSpecifiedLevelsRequest, initOverrides?: RequestInit): Promise<void> {
        await this.postSpecifiedLevelsRaw(requestParameters, initOverrides);
    }

}
