// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package cmd_test

import (
	"fmt"
	"os"
	"path/filepath"
	"regexp"
	"runtime"
	"strings"
	"testing"

	"golang.org/x/tools/internal/lsp/cmd"
	"golang.org/x/tools/internal/lsp/tests"
	"golang.org/x/tools/internal/span"
	"golang.org/x/tools/internal/tool"
)

const (
	expectedDefinitionsCount     = 28
	expectedTypeDefinitionsCount = 2
)

type godefMode int

const (
	plainGodef = godefMode(1 << iota)
	jsonGoDef
)

var godefModes = []godefMode{
	plainGodef,
	jsonGoDef,
}

func TestDefinitionHelpExample(t *testing.T) {
	// TODO: https://golang.org/issue/32794.
	t.Skip()
	if runtime.GOOS == "android" {
		t.Skip("not all source files are available on android")
	}
	dir, err := os.Getwd()
	if err != nil {
		t.Errorf("could not get wd: %v", err)
		return
	}
	thisFile := filepath.Join(dir, "definition.go")
	baseArgs := []string{"query", "definition"}
	expect := regexp.MustCompile(`(?s)^[\w/\\:_-]+flag[/\\]flag.go:\d+:\d+-\d+: defined here as FlagSet struct {.*}$`)
	for _, query := range []string{
		fmt.Sprintf("%v:%v:%v", thisFile, cmd.ExampleLine, cmd.ExampleColumn),
		fmt.Sprintf("%v:#%v", thisFile, cmd.ExampleOffset)} {
		args := append(baseArgs, query)
		got := captureStdOut(t, func() {
			tool.Main(tests.Context(t), cmd.New("gopls-test", "", nil), args)
		})
		if !expect.MatchString(got) {
			t.Errorf("test with %v\nexpected:\n%s\ngot:\n%s", args, expect, got)
		}
	}
}

func (r *runner) Definition(t *testing.T, data tests.Definitions) {
	// TODO: https://golang.org/issue/32794.
	t.Skip()
	for _, d := range data {
		if d.IsType || d.OnlyHover {
			// TODO: support type definition, hover queries
			continue
		}
		d.Src = span.New(d.Src.URI(), span.NewPoint(0, 0, d.Src.Start().Offset()), span.Point{})
		for _, mode := range godefModes {
			args := []string{"-remote=internal", "query"}
			tag := d.Name + "-definition"
			if mode&jsonGoDef != 0 {
				tag += "-json"
				args = append(args, "-json")
			}
			args = append(args, "definition")
			uri := d.Src.URI()
			args = append(args, fmt.Sprint(d.Src))
			got := captureStdOut(t, func() {
				app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Exported.Config.Env)
				tool.Main(r.ctx, app, args)
			})
			got = normalizePaths(r.data, got)
			if mode&jsonGoDef != 0 && runtime.GOOS == "windows" {
				got = strings.Replace(got, "file:///", "file://", -1)
			}
			expect := strings.TrimSpace(string(r.data.Golden(tag, uri.Filename(), func() ([]byte, error) {
				return []byte(got), nil
			})))
			if expect != "" && !strings.HasPrefix(got, expect) {
				t.Errorf("definition %v failed with %#v expected:\n%q\ngot:\n%q", tag, args, expect, got)
			}
		}
	}
}
