/**
 * Copyright (C) 2024 Hedera Hashgraph, 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.
 *
 */
import { ComponentType } from './enumerations.js';
import { BaseComponent } from './components/base_component.js';
import { RelayComponent } from './components/relay_component.js';
import { HaProxyComponent } from './components/ha_proxy_component.js';
import { MirrorNodeComponent } from './components/mirror_node_component.js';
import { EnvoyProxyComponent } from './components/envoy_proxy_component.js';
import { ConsensusNodeComponent } from './components/consensus_node_component.js';
import { MirrorNodeExplorerComponent } from './components/mirror_node_explorer_component.js';
import { type ComponentsDataStructure, type ComponentName, type Cluster, type Namespace } from './types.js';
import type { ToObject, Validate } from '../../../types/index.js';
import type { RemoteConfigMetadata } from './metadata.js';
export interface RemoteConfigData {
    metadata: RemoteConfigMetadata;
    clusters: Record<Cluster, Namespace>;
    components: ComponentsDataWrapper;
    lastExecutedCommand: string;
    commandHistory: string[];
}
/**
 * Represent the components in the remote config and handles:
 * - CRUD operations on the components.
 * - Validation.
 * - Conversion FROM and TO plain object.
 */
export declare class ComponentsDataWrapper implements Validate, ToObject<ComponentsDataStructure> {
    readonly relays: Record<ComponentName, RelayComponent>;
    readonly haProxies: Record<ComponentName, HaProxyComponent>;
    readonly mirrorNodes: Record<ComponentName, MirrorNodeComponent>;
    readonly envoyProxies: Record<ComponentName, EnvoyProxyComponent>;
    readonly consensusNodes: Record<ComponentName, ConsensusNodeComponent>;
    readonly mirrorNodeExplorers: Record<ComponentName, MirrorNodeExplorerComponent>;
    /**
     * @param relays - Relay record mapping service name to relay components
     * @param haProxies - HA Proxies record mapping service name to ha proxies components
     * @param mirrorNodes - Mirror Nodes record mapping service name to mirror nodes components
     * @param envoyProxies - Envoy Proxies record mapping service name to envoy proxies components
     * @param consensusNodes - Consensus Nodes record mapping service name to consensus nodes components
     * @param mirrorNodeExplorers - Mirror Node Explorers record mapping service name to mirror node explorers components
     */
    private constructor();
    /** Used to add new component to their respective group. */
    add(serviceName: ComponentName, component: BaseComponent): void;
    /** Used to edit an existing component from their respective group. */
    edit(serviceName: ComponentName, component: BaseComponent): void;
    /** Used to remove specific component from their respective group. */
    remove(serviceName: ComponentName, type: ComponentType): void;
    getComponent<T extends BaseComponent>(type: ComponentType, serviceName: ComponentName): T;
    /**
     * Method used to map the type to the specific component group
     * and pass it to a callback to apply modifications
     */
    private applyCallbackToComponentGroup;
    /**
     * Handles creating instance of the class from plain object.
     *
     * @param components - component groups distinguished by their type.
     */
    static fromObject(components: ComponentsDataStructure): ComponentsDataWrapper;
    /** Used to create an empty instance used to keep the constructor private */
    static initializeEmpty(): ComponentsDataWrapper;
    /** checks if component exists in the respective group */
    private exists;
    validate(): void;
    toObject(): ComponentsDataStructure;
    clone(): ComponentsDataWrapper;
}
