/*---------------------------------------------------------
 * Copyright (C) Microsoft Corporation. All rights reserved.
 * Modification copyright 2021 The Go Authors. All rights reserved.
 * Licensed under the MIT License. See LICENSE in the project root for license information.
 *--------------------------------------------------------*/

// Modified from:
// https://github.com/microsoft/vscode-python/blob/main/src/client/debugger/extension/attachQuickPick/wmicProcessParser.ts.
// Added arguments to get the ExecutablePath from wmic.

'use strict';

import { AttachItem, ProcessListCommand } from '../pickProcess';

const wmicNameTitle = 'Name';
const wmicCommandLineTitle = 'CommandLine';
const wmicPidTitle = 'ProcessId';
const wmicExecutableTitle = 'ExecutablePath';
const defaultEmptyEntry: AttachItem = {
	label: '',
	description: '',
	detail: '',
	id: '',
	processName: '',
	commandLine: ''
};

// Perf numbers on Win10:
// | # of processes | Time (ms) |
// |----------------+-----------|
// |			309 |	   413 |
// |			407 |	   463 |
// |			887 |	   746 |
// |		   1308 |	  1132 |
export const wmicCommand: ProcessListCommand = {
	command: 'wmic',
	args: ['process', 'get', 'Name,ProcessId,CommandLine,ExecutablePath', '/FORMAT:list']
};

export function parseWmicProcesses(processes: string): AttachItem[] {
	const lines: string[] = processes.split('\r\n');
	const processEntries: AttachItem[] = [];
	let entry = { ...defaultEmptyEntry };

	for (const line of lines) {
		if (!line.length) {
			continue;
		}

		parseLineFromWmic(line, entry);

		// Each entry of processes has ProcessId as the last line
		if (line.lastIndexOf(wmicPidTitle, 0) === 0) {
			processEntries.push(entry);
			entry = { ...defaultEmptyEntry };
		}
	}

	return processEntries;
}

function parseLineFromWmic(line: string, item: AttachItem): AttachItem {
	const splitter = line.indexOf('=');
	const currentItem = item;

	if (splitter > 0) {
		const key = line.slice(0, splitter).trim();
		let value = line.slice(splitter + 1).trim();

		if (key === wmicNameTitle) {
			currentItem.label = value;
			currentItem.processName = value;
		} else if (key === wmicPidTitle) {
			currentItem.description = value;
			currentItem.id = value;
		} else if (key === wmicCommandLineTitle) {
			const dosDevicePrefix = '\\??\\'; // DOS device prefix, see https://reverseengineering.stackexchange.com/a/15178
			if (value.lastIndexOf(dosDevicePrefix, 0) === 0) {
				value = value.slice(dosDevicePrefix.length);
			}

			currentItem.detail = value;
			currentItem.commandLine = value;
		} else if (key === wmicExecutableTitle) {
			currentItem.executable = value;
		}
	}

	return currentItem;
}
