/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import { IStringDictionary } from '@sussudio/base/common/collections.mjs';
import { Emitter, Event } from '@sussudio/base/common/event.mjs';
import { Disposable } from '@sussudio/base/common/lifecycle.mjs';
import { ResourceMap } from '@sussudio/base/common/map.mjs';
import { IExtUri } from '@sussudio/base/common/resources.mjs';
import { URI } from '@sussudio/base/common/uri.mjs';
import {
	ConfigurationTarget,
	IConfigurationChange,
	IConfigurationChangeEvent,
	IConfigurationData,
	IConfigurationModel,
	IConfigurationOverrides,
	IConfigurationUpdateOverrides,
	IConfigurationValue,
	IOverrides,
} from './configuration.mjs';
import { ConfigurationScope } from './configurationRegistry.mjs';
import { IFileService } from '../../files/common/files.mjs';
import { Workspace } from '../../workspace/common/workspace.mjs';
export interface IInspectValue<V> {
	value?: V;
	override?: V;
	merged?: V;
}
export declare class ConfigurationModel implements IConfigurationModel {
	private readonly _contents;
	private readonly _keys;
	private readonly _overrides;
	readonly raw?: readonly (IStringDictionary<any> | ConfigurationModel)[] | undefined;
	private frozen;
	private readonly overrideConfigurations;
	constructor(
		_contents?: any,
		_keys?: string[],
		_overrides?: IOverrides[],
		raw?: readonly (IStringDictionary<any> | ConfigurationModel)[] | undefined,
	);
	private _rawConfiguration;
	get rawConfiguration(): ConfigurationModel;
	get contents(): any;
	get overrides(): IOverrides[];
	get keys(): string[];
	isEmpty(): boolean;
	isFrozen(): boolean;
	getValue<V>(section: string | undefined): V;
	inspect<V>(section: string | undefined, overrideIdentifier?: string | null): IInspectValue<V>;
	getOverrideValue<V>(section: string | undefined, overrideIdentifier: string): V | undefined;
	getKeysForOverrideIdentifier(identifier: string): string[];
	getAllOverrideIdentifiers(): string[];
	override(identifier: string): ConfigurationModel;
	merge(...others: ConfigurationModel[]): ConfigurationModel;
	freeze(): ConfigurationModel;
	private createOverrideConfigurationModel;
	private mergeContents;
	private checkAndFreeze;
	private getContentsForOverrideIdentifer;
	toJSON(): IConfigurationModel;
	setValue(key: string, value: any): void;
	removeValue(key: string): void;
	private addKey;
	private removeKey;
}
export interface ConfigurationParseOptions {
	scopes: ConfigurationScope[] | undefined;
	skipRestricted?: boolean;
}
export declare class ConfigurationModelParser {
	protected readonly _name: string;
	private _raw;
	private _configurationModel;
	private _restrictedConfigurations;
	private _parseErrors;
	constructor(_name: string);
	get configurationModel(): ConfigurationModel;
	get restrictedConfigurations(): string[];
	get errors(): any[];
	parse(content: string | null | undefined, options?: ConfigurationParseOptions): void;
	reparse(options: ConfigurationParseOptions): void;
	parseRaw(raw: any, options?: ConfigurationParseOptions): void;
	private doParseContent;
	protected doParseRaw(
		raw: any,
		options?: ConfigurationParseOptions,
	): IConfigurationModel & {
		restricted?: string[];
		hasExcludedProperties?: boolean;
	};
	private filter;
	private toOverrides;
}
export declare class UserSettings extends Disposable {
	private readonly userSettingsResource;
	private readonly scopes;
	private readonly fileService;
	private readonly parser;
	private readonly parseOptions;
	protected readonly _onDidChange: Emitter<void>;
	readonly onDidChange: Event<void>;
	constructor(
		userSettingsResource: URI,
		scopes: ConfigurationScope[] | undefined,
		extUri: IExtUri,
		fileService: IFileService,
	);
	loadConfiguration(): Promise<ConfigurationModel>;
	reparse(): ConfigurationModel;
	getRestrictedSettings(): string[];
}
export declare class Configuration {
	private _defaultConfiguration;
	private _policyConfiguration;
	private _applicationConfiguration;
	private _localUserConfiguration;
	private _remoteUserConfiguration;
	private _workspaceConfiguration;
	private _folderConfigurations;
	private _memoryConfiguration;
	private _memoryConfigurationByResource;
	private _freeze;
	private _workspaceConsolidatedConfiguration;
	private _foldersConsolidatedConfigurations;
	constructor(
		_defaultConfiguration: ConfigurationModel,
		_policyConfiguration: ConfigurationModel,
		_applicationConfiguration: ConfigurationModel,
		_localUserConfiguration: ConfigurationModel,
		_remoteUserConfiguration?: ConfigurationModel,
		_workspaceConfiguration?: ConfigurationModel,
		_folderConfigurations?: ResourceMap<ConfigurationModel>,
		_memoryConfiguration?: ConfigurationModel,
		_memoryConfigurationByResource?: ResourceMap<ConfigurationModel>,
		_freeze?: boolean,
	);
	getValue(section: string | undefined, overrides: IConfigurationOverrides, workspace: Workspace | undefined): any;
	updateValue(key: string, value: any, overrides?: IConfigurationUpdateOverrides): void;
	inspect<C>(key: string, overrides: IConfigurationOverrides, workspace: Workspace | undefined): IConfigurationValue<C>;
	keys(workspace: Workspace | undefined): {
		default: string[];
		user: string[];
		workspace: string[];
		workspaceFolder: string[];
	};
	updateDefaultConfiguration(defaultConfiguration: ConfigurationModel): void;
	updatePolicyConfiguration(policyConfiguration: ConfigurationModel): void;
	updateApplicationConfiguration(applicationConfiguration: ConfigurationModel): void;
	updateLocalUserConfiguration(localUserConfiguration: ConfigurationModel): void;
	updateRemoteUserConfiguration(remoteUserConfiguration: ConfigurationModel): void;
	updateWorkspaceConfiguration(workspaceConfiguration: ConfigurationModel): void;
	updateFolderConfiguration(resource: URI, configuration: ConfigurationModel): void;
	deleteFolderConfiguration(resource: URI): void;
	compareAndUpdateDefaultConfiguration(defaults: ConfigurationModel, keys?: string[]): IConfigurationChange;
	compareAndUpdatePolicyConfiguration(policyConfiguration: ConfigurationModel): IConfigurationChange;
	compareAndUpdateApplicationConfiguration(application: ConfigurationModel): IConfigurationChange;
	compareAndUpdateLocalUserConfiguration(user: ConfigurationModel): IConfigurationChange;
	compareAndUpdateRemoteUserConfiguration(user: ConfigurationModel): IConfigurationChange;
	compareAndUpdateWorkspaceConfiguration(workspaceConfiguration: ConfigurationModel): IConfigurationChange;
	compareAndUpdateFolderConfiguration(resource: URI, folderConfiguration: ConfigurationModel): IConfigurationChange;
	compareAndDeleteFolderConfiguration(folder: URI): IConfigurationChange;
	get defaults(): ConfigurationModel;
	get applicationConfiguration(): ConfigurationModel;
	private _userConfiguration;
	get userConfiguration(): ConfigurationModel;
	get localUserConfiguration(): ConfigurationModel;
	get remoteUserConfiguration(): ConfigurationModel;
	get workspaceConfiguration(): ConfigurationModel;
	protected get folderConfigurations(): ResourceMap<ConfigurationModel>;
	private getConsolidatedConfigurationModel;
	private getConsolidatedConfigurationModelForResource;
	private getWorkspaceConsolidatedConfiguration;
	private getFolderConsolidatedConfiguration;
	private getFolderConfigurationModelForResource;
	toData(): IConfigurationData;
	allKeys(): string[];
	protected allOverrideIdentifiers(): string[];
	protected getAllKeysForOverrideIdentifier(overrideIdentifier: string): string[];
	static parse(data: IConfigurationData): Configuration;
	private static parseConfigurationModel;
}
export declare function mergeChanges(...changes: IConfigurationChange[]): IConfigurationChange;
export declare class ConfigurationChangeEvent implements IConfigurationChangeEvent {
	readonly change: IConfigurationChange;
	private readonly previous;
	private readonly currentConfiguraiton;
	private readonly currentWorkspace?;
	private readonly _marker;
	private readonly _markerCode1;
	private readonly _markerCode2;
	private readonly _affectsConfigStr;
	readonly affectedKeys: Set<string>;
	source: ConfigurationTarget;
	sourceConfig: any;
	constructor(
		change: IConfigurationChange,
		previous:
			| {
					workspace?: Workspace;
					data: IConfigurationData;
			  }
			| undefined,
		currentConfiguraiton: Configuration,
		currentWorkspace?: Workspace | undefined,
	);
	private _previousConfiguration;
	get previousConfiguration(): Configuration | undefined;
	affectsConfiguration(section: string, overrides?: IConfigurationOverrides): boolean;
}
