/*---------------------------------------------------------------------------------------------
 *  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 { Disposable, IDisposable } from '@sussudio/base/common/lifecycle.mjs';
import {
	IFileSystemProviderWithFileReadWriteCapability,
	IFileChange,
	IWatchOptions,
	IStat,
	IFileOverwriteOptions,
	FileType,
	IFileWriteOptions,
	IFileDeleteOptions,
	IFileSystemProviderWithFileReadStreamCapability,
	IFileReadStreamOptions,
	IFileSystemProviderWithFileAtomicReadCapability,
	IFileSystemProviderWithFileFolderCopyCapability,
} from '../../files/common/files.mjs';
import { URI } from '@sussudio/base/common/uri.mjs';
import { CancellationToken } from '@sussudio/base/common/cancellation.mjs';
import { ReadableStreamEvents } from '@sussudio/base/common/stream.mjs';
import { ILogService } from '../../log/common/log.mjs';
/**
 * This is a wrapper on top of the local filesystem provider which will
 * 	- Convert the user data resources to file system scheme and vice-versa
 *  - Enforces atomic reads for user data
 */
export declare class FileUserDataProvider
	extends Disposable
	implements
		IFileSystemProviderWithFileReadWriteCapability,
		IFileSystemProviderWithFileReadStreamCapability,
		IFileSystemProviderWithFileAtomicReadCapability,
		IFileSystemProviderWithFileFolderCopyCapability
{
	private readonly fileSystemScheme;
	private readonly fileSystemProvider;
	private readonly userDataScheme;
	private readonly logService;
	get capabilities(): number;
	readonly onDidChangeCapabilities: Event<void>;
	private readonly _onDidChangeFile;
	readonly onDidChangeFile: Event<readonly IFileChange[]>;
	private readonly watchResources;
	constructor(
		fileSystemScheme: string,
		fileSystemProvider: IFileSystemProviderWithFileReadWriteCapability &
			(
				| IFileSystemProviderWithFileReadStreamCapability
				| IFileSystemProviderWithFileAtomicReadCapability
				| IFileSystemProviderWithFileFolderCopyCapability
			),
		userDataScheme: string,
		logService: ILogService,
	);
	watch(resource: URI, opts: IWatchOptions): IDisposable;
	stat(resource: URI): Promise<IStat>;
	mkdir(resource: URI): Promise<void>;
	rename(from: URI, to: URI, opts: IFileOverwriteOptions): Promise<void>;
	readFile(resource: URI): Promise<Uint8Array>;
	readFileStream(
		resource: URI,
		opts: IFileReadStreamOptions,
		token: CancellationToken,
	): ReadableStreamEvents<Uint8Array>;
	readdir(resource: URI): Promise<[string, FileType][]>;
	writeFile(resource: URI, content: Uint8Array, opts: IFileWriteOptions): Promise<void>;
	delete(resource: URI, opts: IFileDeleteOptions): Promise<void>;
	copy(from: URI, to: URI, opts: IFileOverwriteOptions): Promise<void>;
	private handleFileChanges;
	private toFileSystemResource;
	private toUserDataResource;
}
