/*---------------------------------------------------------
 * Copyright 2021 The Go Authors. All rights reserved.
 * Licensed under the MIT License. See LICENSE in the project root for license information.
 *--------------------------------------------------------*/
import { execFile } from 'child_process';
import { window, CancellationToken, TextDocumentContentProvider, Uri } from 'vscode';
import { outputChannel } from './goStatus';
import { getBinPath } from './util';

export class ProfileDocumentContentProvider implements TextDocumentContentProvider {
	provideTextDocumentContent(uri: Uri, token: CancellationToken): Promise<string | undefined> {
		return this.pprof(uri, token);
	}

	private pprof(uri: Uri, token: CancellationToken) {
		const goBin = getBinPath('go');
		return new Promise<string | undefined>((resolve) => {
			const cp = execFile(goBin, ['tool', 'pprof', '-tree', uri.fsPath], async (err, stdout, stderr) => {
				if (err || stderr) {
					const m = 'Failed to execute `go tool pprof`';
					if (err) outputChannel.appendLine(`${m}: ${err}`);
					else outputChannel.append(`${m}:\n${stderr}`);
					outputChannel.show();
					await window.showErrorMessage(m);
					resolve(void 0);
				} else {
					resolve(stdout);
				}
			});

			token?.onCancellationRequested(() => cp.kill());
		});
	}
}
