/**
 * Copyright 2022 Google LLC
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
declare const common: any;
import { protos } from '@google-cloud/spanner-api';
import instanceAdmin = protos.google;
import { Operation as GaxOperation } from 'google-gax';
import { LongRunningCallback, RequestCallback, ResourceCallback, NormalCallback } from './common';
import { GetInstanceConfigCallback, GetInstanceConfigOptions, GetInstanceConfigResponse, RequestConfig, Spanner } from './index';
import { CallOptions } from 'google-gax';
export type IOperation = instanceAdmin.longrunning.IOperation;
export type CreateInstanceConfigCallback = LongRunningCallback<InstanceConfig>;
export type SetInstanceConfigMetadataCallback = ResourceCallback<GaxOperation, IOperation>;
export type DeleteInstanceConfigCallback = NormalCallback<instanceAdmin.protobuf.IEmpty>;
export type ExistsInstanceConfigCallback = NormalCallback<boolean>;
export type CreateInstanceConfigResponse = [
    InstanceConfig,
    GaxOperation,
    IOperation
];
export type SetInstanceConfigMetadataResponse = [GaxOperation, IOperation];
export type DeleteInstanceConfigResponse = [instanceAdmin.protobuf.IEmpty];
export type ExistsInstanceConfigResponse = boolean;
export type IInstanceConfig = instanceAdmin.spanner.admin.instance.v1.IInstanceConfig;
interface InstanceConfigRequest {
    (config: RequestConfig, callback: ResourceCallback<GaxOperation, IOperation>): void;
    <T>(config: RequestConfig, callback: RequestCallback<T>): void;
    <T, R>(config: RequestConfig, callback: RequestCallback<T, R>): void;
}
export interface SetInstanceConfigMetadataRequest {
    instanceConfig: IInstanceConfig;
    validateOnly?: boolean;
    gaxOpts?: CallOptions;
}
interface DeleteInstanceConfigRequest {
    etag?: string;
    validateOnly?: boolean;
    gaxOpts?: CallOptions;
}
/**
 * The {@link InstanceConfig} class represents a possible configuration for a
 * Cloud Spanner instance.
 *
 * Create an `InstanceConfig` object to interact with a Cloud Spanner instance
 * config.
 *
 * @class
 *
 * @param {Spanner} spanner {@link Spanner} instance.
 * @param {string} name Name of the instance config.
 *
 * @example
 * ```
 * const {Spanner} = require('@google-cloud/spanner');
 * const spanner = new Spanner();
 * const instance = spanner.instanceConfig('my-instance-config');
 * ```
 */
declare class InstanceConfig extends common.GrpcServiceObject {
    formattedName_: string;
    request: InstanceConfigRequest;
    metadata?: IInstanceConfig;
    resourceHeader_: {
        [k: string]: string;
    };
    constructor(spanner: Spanner, name: string);
    /**
     * Gets the metadata from the backend for this InstanceConfig.
     */
    /**
     * @typedef {array} GetInstanceConfigResponse
     * @property {object[]} 0 The metadata of the instance config.
     * @property {string} 0.name The unique identifier for the instance config.
     * @property {string} 0.displayName The name of the instance config as it
     *     appears in UIs.
     * @property {google.spanner.admin.instance.v1.IReplicaInfo[]} 0.replicas The replicas used by
     *     this instance config.
     * @property {string[]} 0.leaderOptions The possible leader options for this instance config.
     */
    /**
     * @callback GetInstanceConfigCallback
     * @param {?Error} err Request error, if any.
     * @param {object} instanceConfig The metadata of the instance config.
     * @param {string} instanceConfig.name The unique identifier for the instance
     *     config.
     * @param {string} instanceConfig.displayName The name of the instance config
     *     as it appears in UIs.
     * @param {google.spanner.admin.instance.v1.IReplicaInfo[]} instanceConfig.replicas The replicas used by
     *     this instance config.
     * @param {string[]} 0.leaderOptions The possible leader options for this instance config.
     */
    /**
     * Gets the metadata from the backend for this InstanceConfig.
     *
     * Wrapper around {@link v1.InstanceAdminClient#getInstanceConfig}.
     *
     * @see {@link v1.InstanceAdminClient#getInstanceConfig}
     * @see [GetInstanceConfig API Documentation](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.admin.instance.v1#google.spanner.admin.instance.v1.InstanceAdmin.GetInstanceConfig)
     *
     * @param {GetInstanceConfigCallback} [callback] Callback function.
     * @returns {Promise<GetInstanceConfigResponse>}
     *
     * @example
     * ```
     * const {Spanner} = require('@google-cloud/spanner');
     * const spanner = new Spanner();
     *
     * const instanceConfig = spanner.instanceConfig('custom-my-instance-config');
     *
     * instanceConfig.get(function(err, instanceConfig) {
     *   // `instanceConfig` is an instance configuration descriptor.
     * });
     *
     * //-
     * // If the callback is omitted, we'll return a Promise.
     * //-
     * instanceConfig.get().then(function(data) {
     *   const instanceConfig = data[0];
     * });
     * ```
     */
    get(options?: GetInstanceConfigOptions): Promise<GetInstanceConfigResponse>;
    get(callback: GetInstanceConfigCallback): void;
    get(options: GetInstanceConfigOptions, callback: GetInstanceConfigCallback): void;
    /**
     * Update the metadata for this instance config. Note that this method follows
     * PATCH semantics, so previously-configured settings will persist.
     * This function can only be called for deleting user managed instance
     * configs.
     *
     * Wrapper around {@link v1.InstanceAdminClient#updateInstanceConfig}.
     *
     * @see {@link v1.InstanceAdminClient#updateInstanceConfig}
     * @see [UpdateInstanceConfig API Documentation](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.admin.instance.v1#google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstanceConfig)
     *
     * @param {object} metadata The metadata you wish to set.
     * @param {object} [gaxOptions] Request configuration options,
     *     See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions}
     *     for more details.
     * @param {SetInstanceConfigMetadataCallback} [callback] Callback function.
     * @returns {Promise<LongRunningOperationResponse>}
     *
     * @example
     * ```
     * const {Spanner} = require('@google-cloud/spanner');
     * const spanner = new Spanner();
     *
     * const instanceConfig = spanner.instanceConfig('custom-my-instance-config');
     *
     * const metadata = {
     *   instanceConfig: {
     *     displayName: 'My Instance Config'
     *   }
     * };
     *
     * instanceConfig.setMetadata(metadata, function(err, operation, apiResponse) {
     *   if (err) {
     *     // Error handling omitted.
     *   }
     *
     *   operation
     *     .on('error', function(err) {})
     *     .on('complete', function() {
     *       // Metadata updated successfully.
     *     });
     * });
     *
     * //-
     * // If the callback is omitted, we'll return a Promise.
     * //-
     * instanceConfig.setMetadata(metadata).then(function(data) {
     *   const operation = data[0];
     *   const apiResponse = data[1];
     * });
     * ```
     */
    setMetadata(config: SetInstanceConfigMetadataRequest): Promise<SetInstanceConfigMetadataResponse>;
    setMetadata(config: SetInstanceConfigMetadataRequest, callback: SetInstanceConfigMetadataCallback): void;
    /**
     * @typedef {array} DeleteInstanceConfigResponse
     * @property {object} 0 The full API response.
     */
    /**
     * @callback DeleteInstanceConfigCallback
     * @param {?Error} err Request error, if any.
     * @param {object} apiResponse The full API response.
     */
    /**
     * Delete the instance config. This function can only be called for deleting
     * user managed instance configs.
     *
     * Wrapper around {@link v1.InstanceAdminClient#deleteInstanceConfig}.
     *
     * @see {@link v1.InstanceAdminClient#deleteInstanceConfig}
     * @see [DeleteInstanceConfig API Documentation](https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.admin.instance.v1#google.spanner.admin.instance.v1.InstanceAdmin.DeleteInstanceConfig)
     *
     * @param {object} [gaxOptions] Request configuration options,
     *     See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions}
     *     for more details.
     * @param {DeleteInstanceConfigCallback} [callback] Callback function.
     * @returns {Promise<DeleteInstanceConfigResponse>}
     *
     * @example
     * ```
     * const {Spanner} = require('@google-cloud/spanner');
     * const spanner = new Spanner();
     *
     * const instanceConfig = spanner.instanceConfig('custom-my-instance-config');
     *
     * instanceConfig.delete(function(err, apiResponse) {
     *   if (err) {
     *     // Error handling omitted.
     *   }
     *
     *   // Instance config was deleted successfully.
     * });
     *
     * //-
     * // If the callback is omitted, we'll return a Promise.
     * //-
     * instanceConfig.delete().then(function(data) {
     *   const apiResponse = data[0];
     * });
     * ```
     */
    delete(config?: DeleteInstanceConfigRequest): Promise<DeleteInstanceConfigResponse>;
    delete(callback: DeleteInstanceConfigCallback): void;
    delete(config: DeleteInstanceConfigRequest, callback: DeleteInstanceConfigCallback): void;
    /**
     * @typedef {array} ExistsInstanceConfigResponse
     * @property {boolean} 0 Whether the {@link InstanceConfig} exists.
     */
    /**
     * @callback ExistsInstanceConfigCallback
     * @param {?Error} err Request error, if any.
     * @param {boolean} exists Whether the {@link InstanceConfig} exists.
     */
    /**
     * Check if an instance config exists.
     *
     * @method InstanceConfig#exists
     * @param {object} [gaxOptions] Request configuration options,
     *     See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions}
     *     for more details.
     * @param {ExistsInstanceConfigCallback} [callback] Callback function.
     * @returns {Promise<ExistsInstanceConfigResponse>} When resolved, contains
     *     true if the instance config exists and false if it does not exist.
     *
     * @example
     * ```
     * const {Spanner} = require('@google-cloud/spanner');
     * const spanner = new Spanner();
     *
     * const instanceConfig = spanner.instanceConfig('custom-my-instance-config');
     *
     * const exists = await instanceConfig.exists();
     * console.log(`Does instance config exist? ${exists}`);
     * ```
     */
    exists(): Promise<ExistsInstanceConfigResponse>;
    exists(callback: ExistsInstanceConfigCallback): void;
    /**
     * Format the instance config name to include the project ID.
     *
     * @private
     *
     * @param {string} projectId The project ID.
     * @param {string} name The instance config name.
     * @returns {string}
     *
     * @example
     * ```
     * InstanceConfig.formatName_('grape-spaceship-123', 'my-instance-config');
     * // 'projects/grape-spaceship-123/instanceConfigs/my-instance-config'
     * ```
     */
    static formatName_(projectId: string, name: string): string;
}
/**
 * Reference to the {@link InstanceConfig} class.
 * @name module:@google-cloud/spanner.InstanceConfig
 * @see InstanceConfig
 */
export { InstanceConfig };
