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

import * as assert from 'assert';
import moment = require('moment');
import semver = require('semver');
import sinon = require('sinon');
import * as vscode from 'vscode';
import * as lsp from '../../src/goLanguageServer';
import { getTool, Tool } from '../../src/goTools';

suite('gopls configuration tests', () => {
	test('filterGoplsDefaultConfigValues', async () => {
		const defaultGoplsConfig = vscode.workspace.getConfiguration('gopls');
		const defaultGoplsAnalysesConfig = vscode.workspace.getConfiguration('gopls.analyses');

		interface TestCase {
			name: string;
			section: string;
			input: any;
			want: any;
		}
		const testCases: TestCase[] = [
			{
				name: 'user set no gopls settings',
				section: 'gopls',
				input: defaultGoplsConfig,
				want: {}
			},
			{
				name: 'user set some gopls settings',
				section: 'gopls',
				input: Object.assign({}, defaultGoplsConfig, {
					buildFlags: ['-something'],
					env: { foo: 'bar' },
					hoverKind: 'NoDocumentation',
					usePlaceholders: true,
					linkTarget: 'godoc.org'
				}),
				want: {
					buildFlags: ['-something'],
					env: { foo: 'bar' },
					hoverKind: 'NoDocumentation',
					usePlaceholders: true,
					linkTarget: 'godoc.org',
				},
			},
			{
				name: 'user set extra gopls settings',
				section: 'gopls',
				input: Object.assign({}, defaultGoplsConfig, {
					undefinedGoplsSetting: true
				}),
				want: {
					undefinedGoplsSetting: true,
				},
			},
			{
				name: 'never returns undefined',
				section: 'undefined.section',
				input: undefined,
				want: {},
			},
		];
		testCases.map((tc: TestCase) => {
			const actual = lsp.filterGoplsDefaultConfigValues(tc.input, undefined);
			assert.deepStrictEqual(actual, tc.want, `Failed: ${tc.name}`);
		});
	});

	test('passGoConfigToGoplsConfigValues', async () => {
		interface TestCase {
			name: string;
			goplsConfig: any;
			goConfig: any;
			want: any;
		}
		const testCases: TestCase[] = [
			{
				name: 'undefined gopls, go configs result in an empty config',
				goplsConfig: undefined,
				goConfig: undefined,
				want: {}
			},
			{
				name: 'empty gopls, go configs result in an empty config',
				goplsConfig: {},
				goConfig: {},
				want: {}
			},
			{
				name: 'empty gopls, default go configs result in an empty config',
				goplsConfig: {},
				goConfig: {
					buildFlags: [],
					buildTags: '',
				},
				want: {}
			},
			{
				name: 'pass go config buildFlags to gopls config',
				goplsConfig: {},
				goConfig: { buildFlags: ['-modfile', 'gopls.mod', '-tags', 'tag1,tag2', '-modcacherw'] },
				want: { 'build.buildFlags': ['-modfile', 'gopls.mod', '-tags', 'tag1,tag2', '-modcacherw'] }
			},
			{
				name: 'pass go config buildTags to gopls config',
				goplsConfig: {},
				goConfig: { buildTags: 'tag1,tag2' },
				want: { 'build.buildFlags': ['-tags', 'tag1,tag2'] }
			},
			{
				name: 'do not pass go config buildTags if buildFlags already have tags',
				goplsConfig: {},
				goConfig: {
					buildFlags: ['-tags', 'tag0'],
					buildTags: 'tag1,tag2'
				},
				want: { 'build.buildFlags': ['-tags', 'tag0'] }
			},
			{
				name: 'do not mutate other gopls config but gopls.buildFlags',
				goplsConfig: {
					'build.env': { GOPROXY: 'direct' }
				},
				goConfig: { buildFlags: ['-modfile', 'gopls.mod', '-tags', 'tag1,tag2', '-modcacherw'] },
				want: {
					'build.env': { GOPROXY: 'direct' },
					'build.buildFlags': ['-modfile', 'gopls.mod', '-tags', 'tag1,tag2', '-modcacherw']
				}
			},

			{
				name: 'do not mutate misconfigured gopls.buildFlags',
				goplsConfig: {
					'build.buildFlags': '-modfile gopls.mod',  // misconfiguration
				},
				goConfig: {
					buildFlags: '-modfile go.mod -tags tag1 -modcacherw',
				},
				want: { 'build.buildFlags': '-modfile gopls.mod' }
			},
			{
				name: 'do not overwrite gopls config if it is explicitly set',
				goplsConfig: {
					'build.env': { GOPROXY: 'direct' },
					'build.buildFlags': [],  // empty
				},
				goConfig: {
					// expect only non-conflicting flags (tags, modcacherw) passing.
					buildFlags: ['-modfile go.mod -tags tag1 -modcacherw'],
					buildTags: 'tag3',
				},
				want: {
					'build.env': { GOPROXY: 'direct' },
					'build.buildFlags': [],
				}  // gopls.buildFlags untouched.
			},

		];
		testCases.map((tc: TestCase) => {
			const actual = lsp.passGoConfigToGoplsConfigValues(tc.goplsConfig, tc.goConfig);
			assert.deepStrictEqual(actual, tc.want, `Failed: ${tc.name}`);
		});
	});
});
