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

'use strict';

import vscode = require('vscode');
import { GO_MODE } from './goMode';
import { isModSupported } from './goModules';

export let outputChannel = vscode.window.createOutputChannel('Go');

export let diagnosticsStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);

let statusBarEntry: vscode.StatusBarItem;
const statusBarItemModule = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
statusBarItemModule.text = '$(megaphone) Go Modules';
statusBarItemModule.tooltip =
	'Modules is enabled for this project. Click to learn more about Modules support in VS Code.';
statusBarItemModule.command = 'go.open.modulesdoc';

export function showHideStatus(editor: vscode.TextEditor) {
	if (statusBarEntry) {
		if (!editor) {
			statusBarEntry.hide();
		} else if (vscode.languages.match(GO_MODE, editor.document)) {
			statusBarEntry.show();
		} else {
			statusBarEntry.hide();
		}
	}

	if (editor) {
		isModSupported(editor.document.uri).then((isMod) => {
			if (isMod) {
				statusBarItemModule.show();
			} else {
				statusBarItemModule.hide();
			}
		});
	} else {
		statusBarItemModule.hide();
	}
}

export function hideGoStatus() {
	if (statusBarEntry) {
		statusBarEntry.dispose();
	}
}

export function showGoStatus(message: string, command: string, tooltip?: string) {
	statusBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE);
	statusBarEntry.text = `$(alert) ${message}`;
	statusBarEntry.command = command;
	statusBarEntry.tooltip = tooltip;
	statusBarEntry.show();
}
