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

import { Event } from '@sussudio/base/common/event.mjs';
import { URI, UriComponents } from '@sussudio/base/common/uri.mjs';
import { IWorkspaceFolder } from '../../workspace/common/workspace.mjs';
export declare const IConfigurationService: import('../../instantiation/common/instantiation.mjs').ServiceIdentifier<IConfigurationService>;
export declare function isConfigurationOverrides(thing: any): thing is IConfigurationOverrides;
export interface IConfigurationOverrides {
	overrideIdentifier?: string | null;
	resource?: URI | null;
}
export declare function isConfigurationUpdateOverrides(thing: any): thing is IConfigurationUpdateOverrides;
export type IConfigurationUpdateOverrides = Omit<IConfigurationOverrides, 'overrideIdentifier'> & {
	overrideIdentifiers?: string[] | null;
};
export declare const enum ConfigurationTarget {
	APPLICATION = 1,
	USER = 2,
	USER_LOCAL = 3,
	USER_REMOTE = 4,
	WORKSPACE = 5,
	WORKSPACE_FOLDER = 6,
	DEFAULT = 7,
	MEMORY = 8,
}
export declare function ConfigurationTargetToString(
	configurationTarget: ConfigurationTarget,
): 'APPLICATION' | 'USER' | 'USER_LOCAL' | 'USER_REMOTE' | 'WORKSPACE' | 'WORKSPACE_FOLDER' | 'DEFAULT' | 'MEMORY';
export interface IConfigurationChange {
	keys: string[];
	overrides: [string, string[]][];
}
export interface IConfigurationChangeEvent {
	readonly source: ConfigurationTarget;
	readonly affectedKeys: ReadonlySet<string>;
	readonly change: IConfigurationChange;
	affectsConfiguration(configuration: string, overrides?: IConfigurationOverrides): boolean;
	readonly sourceConfig: any;
}
export interface IConfigurationValue<T> {
	readonly defaultValue?: T;
	readonly applicationValue?: T;
	readonly userValue?: T;
	readonly userLocalValue?: T;
	readonly userRemoteValue?: T;
	readonly workspaceValue?: T;
	readonly workspaceFolderValue?: T;
	readonly memoryValue?: T;
	readonly policyValue?: T;
	readonly value?: T;
	readonly default?: {
		value?: T;
		override?: T;
	};
	readonly application?: {
		value?: T;
		override?: T;
	};
	readonly user?: {
		value?: T;
		override?: T;
	};
	readonly userLocal?: {
		value?: T;
		override?: T;
	};
	readonly userRemote?: {
		value?: T;
		override?: T;
	};
	readonly workspace?: {
		value?: T;
		override?: T;
	};
	readonly workspaceFolder?: {
		value?: T;
		override?: T;
	};
	readonly memory?: {
		value?: T;
		override?: T;
	};
	readonly policy?: {
		value?: T;
	};
	readonly overrideIdentifiers?: string[];
}
export interface IConfigurationUpdateOptions {
	/**
	 * If `true`, do not notifies the error to user by showing the message box. Default is `false`.
	 */
	donotNotifyError?: boolean;
	/**
	 * How to handle dirty file when updating the configuration.
	 */
	handleDirtyFile?: 'save' | 'revert';
}
export interface IConfigurationService {
	readonly _serviceBrand: undefined;
	onDidChangeConfiguration: Event<IConfigurationChangeEvent>;
	getConfigurationData(): IConfigurationData | null;
	/**
	 * Fetches the value of the section for the given overrides.
	 * Value can be of native type or an object keyed off the section name.
	 *
	 * @param section - Section of the configuraion. Can be `null` or `undefined`.
	 * @param overrides - Overrides that has to be applied while fetching
	 *
	 */
	getValue<T>(): T;
	getValue<T>(section: string): T;
	getValue<T>(overrides: IConfigurationOverrides): T;
	getValue<T>(section: string, overrides: IConfigurationOverrides): T;
	/**
	 * Update a configuration value.
	 *
	 * Use `target` to update the configuration in a specific `ConfigurationTarget`.
	 *
	 * Use `overrides` to update the configuration for a resource or for override identifiers or both.
	 *
	 * Passing a resource through overrides will update the configuration in the workspace folder containing that resource.
	 *
	 * *Note 1:* Updating configuraiton to a default value will remove the configuration from the requested target. If not target is passed, it will be removed from all writeable targets.
	 *
	 * *Note 2:* Use `undefined` value to remove the configuration from the given target. If not target is passed, it will be removed from all writeable targets.
	 *
	 * Use `donotNotifyError` and set it to `true` to surpresss errors.
	 *
	 * @param key setting to be updated
	 * @param value The new value
	 */
	updateValue(key: string, value: any): Promise<void>;
	updateValue(key: string, value: any, target: ConfigurationTarget): Promise<void>;
	updateValue(
		key: string,
		value: any,
		overrides: IConfigurationOverrides | IConfigurationUpdateOverrides,
	): Promise<void>;
	updateValue(
		key: string,
		value: any,
		overrides: IConfigurationOverrides | IConfigurationUpdateOverrides,
		target: ConfigurationTarget,
		options?: IConfigurationUpdateOptions,
	): Promise<void>;
	inspect<T>(key: string, overrides?: IConfigurationOverrides): IConfigurationValue<Readonly<T>>;
	reloadConfiguration(target?: ConfigurationTarget | IWorkspaceFolder): Promise<void>;
	keys(): {
		default: string[];
		user: string[];
		workspace: string[];
		workspaceFolder: string[];
		memory?: string[];
	};
}
export interface IConfigurationModel {
	contents: any;
	keys: string[];
	overrides: IOverrides[];
}
export interface IOverrides {
	keys: string[];
	contents: any;
	identifiers: string[];
}
export interface IConfigurationData {
	defaults: IConfigurationModel;
	policy: IConfigurationModel;
	application: IConfigurationModel;
	user: IConfigurationModel;
	workspace: IConfigurationModel;
	folders: [UriComponents, IConfigurationModel][];
}
export interface IConfigurationCompareResult {
	added: string[];
	removed: string[];
	updated: string[];
	overrides: [string, string[]][];
}
export declare function toValuesTree(
	properties: {
		[qualifiedKey: string]: any;
	},
	conflictReporter: (message: string) => void,
): any;
export declare function addToValueTree(
	settingsTreeRoot: any,
	key: string,
	value: any,
	conflictReporter: (message: string) => void,
): void;
export declare function removeFromValueTree(valueTree: any, key: string): void;
/**
 * A helper function to get the configuration value with a specific settings path (e.g. config.some.setting)
 */
export declare function getConfigurationValue<T>(config: any, settingPath: string, defaultValue?: T): T;
export declare function merge(base: any, add: any, overwrite: boolean): void;
export declare function getMigratedSettingValue<T>(
	configurationService: IConfigurationService,
	currentSettingName: string,
	legacySettingName: string,
): T;
export declare function getLanguageTagSettingPlainKey(settingKey: string): string;
