import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
import { coalesce } from '../../../../base/common/arrays.js';
import { UriList } from '../../../../base/common/dataTransfer.js';
import { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';
import { Disposable } from '../../../../base/common/lifecycle.js';
import { Mimes } from '../../../../base/common/mime.js';
import { Schemas } from '../../../../base/common/network.js';
import { relativePath } from '../../../../base/common/resources.js';
import { URI } from '../../../../base/common/uri.js';
import { DocumentPasteTriggerKind } from '../../../common/languages.js';
import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';
import { localizeWithPath } from '../../../../nls.js';
import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.service.js';
const _moduleId = "vs/editor/contrib/dropOrPasteInto/browser/defaultProviders";
class SimplePasteAndDropProvider {
    async provideDocumentPasteEdits(_model, _ranges, dataTransfer, context, token) {
        const edit = await this.getEdit(dataTransfer, token);
        if (!edit) {
            return undefined;
        }
        return {
            edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }],
            dispose() { },
        };
    }
    async provideDocumentDropEdits(_model, _position, dataTransfer, token) {
        const edit = await this.getEdit(dataTransfer, token);
        if (!edit) {
            return;
        }
        return {
            edits: [{ insertText: edit.insertText, title: edit.title, kind: edit.kind, handledMimeType: edit.handledMimeType, yieldTo: edit.yieldTo }],
            dispose() { },
        };
    }
}
class DefaultTextPasteOrDropEditProvider extends SimplePasteAndDropProvider {
    constructor() {
        super(...arguments);
        this.id = DefaultTextPasteOrDropEditProvider.id;
        this.kind = DefaultTextPasteOrDropEditProvider.kind;
        this.dropMimeTypes = [Mimes.text];
        this.pasteMimeTypes = [Mimes.text];
    }
    static { this.id = 'text'; }
    static { this.kind = ( (new HierarchicalKind('text.plain'))); }
    async getEdit(dataTransfer, _token) {
        const textEntry = dataTransfer.get(Mimes.text);
        if (!textEntry) {
            return;
        }
        if (( (dataTransfer.has(Mimes.uriList)))) {
            return;
        }
        const insertText = await textEntry.asString();
        return {
            handledMimeType: Mimes.text,
            title: ( localizeWithPath(_moduleId, 0, "Insert Plain Text")),
            insertText,
            kind: this.kind,
        };
    }
}
class PathProvider extends SimplePasteAndDropProvider {
    constructor() {
        super(...arguments);
        this.kind = ( (new HierarchicalKind('uri.absolute')));
        this.dropMimeTypes = [Mimes.uriList];
        this.pasteMimeTypes = [Mimes.uriList];
    }
    async getEdit(dataTransfer, token) {
        const entries = await extractUriList(dataTransfer);
        if (!entries.length || token.isCancellationRequested) {
            return;
        }
        let uriCount = 0;
        const insertText = ( (entries
            .map(({ uri, originalText }) => {
            if (uri.scheme === Schemas.file) {
                return uri.fsPath;
            }
            else {
                uriCount++;
                return originalText;
            }
        })))
            .join(' ');
        let label;
        if (uriCount > 0) {
            label = entries.length > 1
                ? ( localizeWithPath(_moduleId, 1, "Insert Uris"))
                : ( localizeWithPath(_moduleId, 2, "Insert Uri"));
        }
        else {
            label = entries.length > 1
                ? ( localizeWithPath(_moduleId, 3, "Insert Paths"))
                : ( localizeWithPath(_moduleId, 4, "Insert Path"));
        }
        return {
            handledMimeType: Mimes.uriList,
            insertText,
            title: label,
            kind: this.kind,
        };
    }
}
let RelativePathProvider = class RelativePathProvider extends SimplePasteAndDropProvider {
    constructor(_workspaceContextService) {
        super();
        this._workspaceContextService = _workspaceContextService;
        this.kind = ( (new HierarchicalKind('uri.relative')));
        this.dropMimeTypes = [Mimes.uriList];
        this.pasteMimeTypes = [Mimes.uriList];
    }
    async getEdit(dataTransfer, token) {
        const entries = await extractUriList(dataTransfer);
        if (!entries.length || token.isCancellationRequested) {
            return;
        }
        const relativeUris = coalesce(( (entries.map(({ uri }) => {
            const root = this._workspaceContextService.getWorkspaceFolder(uri);
            return root ? relativePath(root.uri, uri) : undefined;
        }))));
        if (!relativeUris.length) {
            return;
        }
        return {
            handledMimeType: Mimes.uriList,
            insertText: relativeUris.join(' '),
            title: entries.length > 1
                ? ( localizeWithPath(_moduleId, 5, "Insert Relative Paths"))
                : ( localizeWithPath(_moduleId, 6, "Insert Relative Path")),
            kind: this.kind,
        };
    }
};
RelativePathProvider = ( (__decorate([
    ( (__param(0, IWorkspaceContextService)))
], RelativePathProvider)));
class PasteHtmlProvider {
    constructor() {
        this.kind = ( (new HierarchicalKind('html')));
        this.pasteMimeTypes = ['text/html'];
        this._yieldTo = [{ mimeType: Mimes.text }];
    }
    async provideDocumentPasteEdits(_model, _ranges, dataTransfer, context, token) {
        if (context.triggerKind !== DocumentPasteTriggerKind.PasteAs && !context.only?.contains(this.kind)) {
            return;
        }
        const entry = dataTransfer.get('text/html');
        const htmlText = await entry?.asString();
        if (!htmlText || token.isCancellationRequested) {
            return;
        }
        return {
            dispose() { },
            edits: [{
                    insertText: htmlText,
                    yieldTo: this._yieldTo,
                    title: ( localizeWithPath(_moduleId, 7, 'Insert HTML')),
                    kind: this.kind,
                }],
        };
    }
}
async function extractUriList(dataTransfer) {
    const urlListEntry = dataTransfer.get(Mimes.uriList);
    if (!urlListEntry) {
        return [];
    }
    const strUriList = await urlListEntry.asString();
    const entries = [];
    for (const entry of UriList.parse(strUriList)) {
        try {
            entries.push({ uri: ( (URI.parse(entry))), originalText: entry });
        }
        catch {
        }
    }
    return entries;
}
let DefaultDropProvidersFeature = class DefaultDropProvidersFeature extends Disposable {
    constructor(languageFeaturesService, workspaceContextService) {
        super();
        this._register(languageFeaturesService.documentDropEditProvider.register('*', ( (new DefaultTextPasteOrDropEditProvider()))));
        this._register(languageFeaturesService.documentDropEditProvider.register('*', ( (new PathProvider()))));
        this._register(languageFeaturesService.documentDropEditProvider.register('*', ( (new RelativePathProvider(workspaceContextService)))));
    }
};
DefaultDropProvidersFeature = ( (__decorate([
    ( (__param(0, ILanguageFeaturesService))),
    ( (__param(1, IWorkspaceContextService)))
], DefaultDropProvidersFeature)));
let DefaultPasteProvidersFeature = class DefaultPasteProvidersFeature extends Disposable {
    constructor(languageFeaturesService, workspaceContextService) {
        super();
        this._register(languageFeaturesService.documentPasteEditProvider.register('*', ( (new DefaultTextPasteOrDropEditProvider()))));
        this._register(languageFeaturesService.documentPasteEditProvider.register('*', ( (new PathProvider()))));
        this._register(languageFeaturesService.documentPasteEditProvider.register('*', ( (new RelativePathProvider(workspaceContextService)))));
        this._register(languageFeaturesService.documentPasteEditProvider.register('*', ( (new PasteHtmlProvider()))));
    }
};
DefaultPasteProvidersFeature = ( (__decorate([
    ( (__param(0, ILanguageFeaturesService))),
    ( (__param(1, IWorkspaceContextService)))
], DefaultPasteProvidersFeature)));
export { DefaultDropProvidersFeature, DefaultPasteProvidersFeature, DefaultTextPasteOrDropEditProvider };
