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

import { Disposable } from '@sussudio/base/common/lifecycle.mjs';
import Severity from '@sussudio/base/common/severity.mjs';
import { URI } from '@sussudio/base/common/uri.mjs';
import { IEnvironmentService } from '../../environment/common/environment.mjs';
import { Metadata } from './extensionManagement.mjs';
import {
	ExtensionType,
	IExtensionManifest,
	TargetPlatform,
	IExtensionIdentifier,
	IRelaxedExtensionManifest,
	IExtensionDescription,
} from '../../extensions/common/extensions.mjs';
import { IFileService } from '../../files/common/files.mjs';
import { IInstantiationService } from '../../instantiation/common/instantiation.mjs';
import { ILogService } from '../../log/common/log.mjs';
import { IProductService } from '../../product/common/productService.mjs';
import { Event } from '@sussudio/base/common/event.mjs';
import { IExtensionsProfileScannerService } from './extensionsProfileScannerService.mjs';
import { IUserDataProfilesService } from '../../userDataProfile/common/userDataProfile.mjs';
import { IUriIdentityService } from '../../uriIdentity/common/uriIdentity.mjs';
export type IScannedExtensionManifest = IRelaxedExtensionManifest & {
	__metadata?: Metadata;
};
interface IRelaxedScannedExtension {
	type: ExtensionType;
	isBuiltin: boolean;
	identifier: IExtensionIdentifier;
	manifest: IRelaxedExtensionManifest;
	location: URI;
	targetPlatform: TargetPlatform;
	metadata: Metadata | undefined;
	isValid: boolean;
	validations: readonly [Severity, string][];
}
export type IScannedExtension = Readonly<IRelaxedScannedExtension> & {
	manifest: IExtensionManifest;
};
export interface Translations {
	[id: string]: string;
}
export declare namespace Translations {
	function equals(a: Translations, b: Translations): boolean;
}
export type ScanOptions = {
	readonly profileLocation?: URI;
	readonly includeInvalid?: boolean;
	readonly includeAllVersions?: boolean;
	readonly includeUninstalled?: boolean;
	readonly checkControlFile?: boolean;
	readonly language?: string;
	readonly useCache?: boolean;
};
export declare const IExtensionsScannerService: import('../../instantiation/common/instantiation.mjs').ServiceIdentifier<IExtensionsScannerService>;
export interface IExtensionsScannerService {
	readonly _serviceBrand: undefined;
	readonly systemExtensionsLocation: URI;
	readonly userExtensionsLocation: URI;
	readonly onDidChangeCache: Event<ExtensionType>;
	getTargetPlatform(): Promise<TargetPlatform>;
	scanAllExtensions(
		systemScanOptions: ScanOptions,
		userScanOptions: ScanOptions,
		includeExtensionsUnderDev: boolean,
	): Promise<IScannedExtension[]>;
	scanSystemExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
	scanUserExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
	scanExtensionsUnderDevelopment(
		scanOptions: ScanOptions,
		existingExtensions: IScannedExtension[],
	): Promise<IScannedExtension[]>;
	scanExistingExtension(
		extensionLocation: URI,
		extensionType: ExtensionType,
		scanOptions: ScanOptions,
	): Promise<IScannedExtension | null>;
	scanOneOrMultipleExtensions(
		extensionLocation: URI,
		extensionType: ExtensionType,
		scanOptions: ScanOptions,
	): Promise<IScannedExtension[]>;
	scanMetadata(extensionLocation: URI): Promise<Metadata | undefined>;
	updateMetadata(extensionLocation: URI, metadata: Partial<Metadata>): Promise<void>;
	initializeDefaultProfileExtensions(): Promise<void>;
}
export declare abstract class AbstractExtensionsScannerService extends Disposable implements IExtensionsScannerService {
	readonly systemExtensionsLocation: URI;
	readonly userExtensionsLocation: URI;
	private readonly extensionsControlLocation;
	private readonly cacheLocation;
	private readonly userDataProfilesService;
	protected readonly extensionsProfileScannerService: IExtensionsProfileScannerService;
	protected readonly fileService: IFileService;
	protected readonly logService: ILogService;
	private readonly environmentService;
	private readonly productService;
	private readonly uriIdentityService;
	private readonly instantiationService;
	readonly _serviceBrand: undefined;
	protected abstract getTranslations(language: string): Promise<Translations>;
	private readonly _onDidChangeCache;
	readonly onDidChangeCache: Event<ExtensionType>;
	private readonly obsoleteFile;
	private readonly systemExtensionsCachedScanner;
	private readonly userExtensionsCachedScanner;
	private readonly extensionsScanner;
	constructor(
		systemExtensionsLocation: URI,
		userExtensionsLocation: URI,
		extensionsControlLocation: URI,
		cacheLocation: URI,
		userDataProfilesService: IUserDataProfilesService,
		extensionsProfileScannerService: IExtensionsProfileScannerService,
		fileService: IFileService,
		logService: ILogService,
		environmentService: IEnvironmentService,
		productService: IProductService,
		uriIdentityService: IUriIdentityService,
		instantiationService: IInstantiationService,
	);
	private _targetPlatformPromise;
	getTargetPlatform(): Promise<TargetPlatform>;
	scanAllExtensions(
		systemScanOptions: ScanOptions,
		userScanOptions: ScanOptions,
		includeExtensionsUnderDev: boolean,
	): Promise<IScannedExtension[]>;
	scanSystemExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
	scanUserExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
	scanExtensionsUnderDevelopment(
		scanOptions: ScanOptions,
		existingExtensions: IScannedExtension[],
	): Promise<IScannedExtension[]>;
	scanExistingExtension(
		extensionLocation: URI,
		extensionType: ExtensionType,
		scanOptions: ScanOptions,
	): Promise<IScannedExtension | null>;
	scanOneOrMultipleExtensions(
		extensionLocation: URI,
		extensionType: ExtensionType,
		scanOptions: ScanOptions,
	): Promise<IScannedExtension[]>;
	scanMetadata(extensionLocation: URI): Promise<Metadata | undefined>;
	updateMetadata(extensionLocation: URI, metaData: Partial<Metadata>): Promise<void>;
	initializeDefaultProfileExtensions(): Promise<void>;
	private initializeDefaultProfileExtensionsPromise;
	private doInitializeDefaultProfileExtensions;
	private applyScanOptions;
	private dedupExtensions;
	private scanDefaultSystemExtensions;
	private scanDevSystemExtensions;
	private getBuiltInExtensionControl;
	private createExtensionScannerInput;
	private getMtime;
}
export declare function toExtensionDescription(
	extension: IScannedExtension,
	isUnderDevelopment: boolean,
): IExtensionDescription;
export declare class NativeExtensionsScannerService
	extends AbstractExtensionsScannerService
	implements IExtensionsScannerService
{
	private readonly translationsPromise;
	constructor(
		systemExtensionsLocation: URI,
		userExtensionsLocation: URI,
		userHome: URI,
		userDataPath: URI,
		userDataProfilesService: IUserDataProfilesService,
		extensionsProfileScannerService: IExtensionsProfileScannerService,
		fileService: IFileService,
		logService: ILogService,
		environmentService: IEnvironmentService,
		productService: IProductService,
		uriIdentityService: IUriIdentityService,
		instantiationService: IInstantiationService,
	);
	protected getTranslations(language: string): Promise<Translations>;
}
export {};
