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

import * as nls from 'vscode-nls';
import { TypeScriptVersionProvider, TypeScriptVersion } from './versionProvider';
import { Memento, commands, Uri, window, QuickPickItem, workspace } from 'vscode';

const localize = nls.loadMessageBundle();

const useWorkspaceTsdkStorageKey = 'typescript.useWorkspaceTsdk';

interface MyQuickPickItem extends QuickPickItem {
	id: MessageAction;
	version?: TypeScriptVersion;
}

enum MessageAction {
	useLocal,
	useBundled,
	learnMore
}

export class TypeScriptVersionPicker {
	private _currentVersion: TypeScriptVersion;

	public constructor(
		private readonly versionProvider: TypeScriptVersionProvider,
		private readonly workspaceState: Memento
	) {
		this._currentVersion = this.versionProvider.defaultVersion;

		if (this.useWorkspaceTsdkSetting) {
			const localVersion = this.versionProvider.localVersion;
			if (localVersion) {
				this._currentVersion = localVersion;
			}
		}
	}

	public get useWorkspaceTsdkSetting(): boolean {
		return this.workspaceState.get<boolean>(useWorkspaceTsdkStorageKey, false);
	}

	public get currentVersion(): TypeScriptVersion {
		return this._currentVersion;
	}

	public useBundledVersion(): void {
		this._currentVersion = this.versionProvider.bundledVersion;
	}

	public async show(firstRun?: boolean): Promise<{ oldVersion?: TypeScriptVersion, newVersion?: TypeScriptVersion }> {
		const pickOptions: MyQuickPickItem[] = [];

		const shippedVersion = this.versionProvider.defaultVersion;
		pickOptions.push({
			label: (!this.useWorkspaceTsdkSetting
				? '• '
				: '') + localize('useVSCodeVersionOption', 'Use VS Code\'s Version'),
			description: shippedVersion.versionString,
			detail: shippedVersion.pathLabel,
			id: MessageAction.useBundled
		});

		for (const version of this.versionProvider.localVersions) {
			pickOptions.push({
				label: (this.useWorkspaceTsdkSetting && this.currentVersion.path === version.path
					? '• '
					: '') + localize('useWorkspaceVersionOption', 'Use Workspace Version'),
				description: version.versionString,
				detail: version.pathLabel,
				id: MessageAction.useLocal,
				version: version
			});
		}

		pickOptions.push({
			label: localize('learnMore', 'Learn More'),
			description: '',
			id: MessageAction.learnMore
		});

		const selected = await window.showQuickPick<MyQuickPickItem>(pickOptions, {
			placeHolder: localize(
				'selectTsVersion',
				'Select the TypeScript version used for JavaScript and TypeScript language features'),
			ignoreFocusOut: firstRun
		});

		if (!selected) {
			return { oldVersion: this.currentVersion };
		}

		switch (selected.id) {
			case MessageAction.useLocal:
				await this.workspaceState.update(useWorkspaceTsdkStorageKey, true);
				if (selected.version) {
					const tsConfig = workspace.getConfiguration('typescript');
					await tsConfig.update('tsdk', selected.version.pathLabel, false);

					const previousVersion = this.currentVersion;
					this._currentVersion = selected.version;
					return { oldVersion: previousVersion, newVersion: selected.version };
				}
				return { oldVersion: this.currentVersion };

			case MessageAction.useBundled:
				await this.workspaceState.update(useWorkspaceTsdkStorageKey, false);
				const previousVersion = this.currentVersion;
				this._currentVersion = shippedVersion;
				return { oldVersion: previousVersion, newVersion: shippedVersion };


			case MessageAction.learnMore:
				commands.executeCommand('vscode.open', Uri.parse('https://go.microsoft.com/fwlink/?linkid=839919'));
				return { oldVersion: this.currentVersion };

			default:
				return { oldVersion: this.currentVersion };
		}
	}
}