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

import { IConnectionProfile } from 'sql/platform/connection/common/interfaces';
import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement';
import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/browser/objectExplorerService';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { DashboardInput } from 'sql/workbench/browser/editor/profiler/dashboardInput';

/**
 * Get the current global connection, which is the connection from the active editor, unless OE
 * is focused or there is no such editor, in which case it comes from the OE selection. Returns
 * undefined when there is no such connection.
 *
 * @param objectExplorerService
 * @param connectionManagementService
 * @param workbenchEditorService
 * @param topLevelOnly If true, only return top-level (i.e. connected) Object Explorer connections instead of database connections when appropriate
*/
export function getCurrentGlobalConnection(objectExplorerService: IObjectExplorerService, connectionManagementService: IConnectionManagementService, workbenchEditorService: IEditorService, topLevelOnly: boolean = false): IConnectionProfile | undefined {
	let connection: IConnectionProfile | undefined;
	// object Explorer Connection
	let objectExplorerSelection = objectExplorerService.getSelectedProfileAndDatabase();
	if (objectExplorerSelection) {
		if (objectExplorerSelection.profile) {
			if (connectionManagementService.isProfileConnected(objectExplorerSelection.profile)) {
				if (objectExplorerSelection.databaseName && !topLevelOnly) {
					connection = objectExplorerSelection.profile.cloneWithDatabase(objectExplorerSelection.databaseName);
				} else {
					connection = objectExplorerSelection.profile;
				}
			}
		}
		if (objectExplorerService.isFocused()) {
			return connection;
		}
	}

	let activeInput = workbenchEditorService.activeEditor;
	if (activeInput) {
		// dashboard Connection
		if (activeInput instanceof DashboardInput && activeInput.uri) {
			connection = connectionManagementService.getConnectionProfile(activeInput.uri);
		} else if (activeInput.resource) {
			// editor Connection
			connection = connectionManagementService.getConnectionProfile(activeInput.resource.toString(true));
		}
	}

	return connection;
}
