// 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 cmdtest

import (
	"bytes"
	"io/ioutil"
	"os"
	"os/exec"
	"regexp"
	"strings"
	"testing"

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

func (r *runner) Format(t *testing.T, spn span.Span) {
	tag := "gofmt"
	uri := spn.URI()
	filename := uri.Filename()
	expect := string(r.data.Golden(tag, filename, func() ([]byte, error) {
		cmd := exec.Command("gofmt", filename)
		contents, _ := cmd.Output() // ignore error, sometimes we have intentionally ungofmt-able files
		contents = []byte(normalizePaths(r.data, fixFileHeader(string(contents))))
		return contents, nil
	}))
	if expect == "" {
		//TODO: our error handling differs, for now just skip unformattable files
		t.Skip("Unformattable file")
	}
	app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env)
	got := CaptureStdOut(t, func() {
		_ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format"}, filename))
	})
	got = normalizePaths(r.data, got)
	if expect != got {
		t.Errorf("format failed for %s expected:\n%s\ngot:\n%s", filename, expect, got)
	}
	// now check we can build a valid unified diff
	unified := CaptureStdOut(t, func() {
		_ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format", "-d"}, filename))
	})
	checkUnified(t, filename, expect, unified)
}

var unifiedHeader = regexp.MustCompile(`^diff -u.*\n(---\s+\S+\.go\.orig)\s+[\d-:. ]+(\n\+\+\+\s+\S+\.go)\s+[\d-:. ]+(\n@@)`)

func fixFileHeader(s string) string {
	match := unifiedHeader.FindStringSubmatch(s)
	if match == nil {
		return s
	}
	return strings.Join(append(match[1:], s[len(match[0]):]), "")
}

func checkUnified(t *testing.T, filename string, expect string, patch string) {
	testenv.NeedsTool(t, "patch")
	if strings.Count(patch, "\n+++ ") > 1 {
		// TODO(golang/go/#34580)
		t.Skip("multi-file patch tests not supported yet")
	}
	applied := ""
	if patch == "" {
		applied = expect
	} else {
		temp, err := ioutil.TempFile("", "applied")
		if err != nil {
			t.Fatal(err)
		}
		temp.Close()
		defer os.Remove(temp.Name())
		cmd := exec.Command("patch", "-u", "-p0", "-o", temp.Name(), filename)
		cmd.Stdin = bytes.NewBuffer([]byte(patch))
		msg, err := cmd.CombinedOutput()
		if err != nil {
			t.Errorf("failed applying patch to %s: %v\ngot:\n%s\npatch:\n%s", filename, err, msg, patch)
			return
		}
		out, err := ioutil.ReadFile(temp.Name())
		if err != nil {
			t.Errorf("failed reading patched output for %s: %v\n", filename, err)
			return
		}
		applied = string(out)
	}
	if expect != applied {
		t.Errorf("apply unified gave wrong result for %s expected:\n%s\ngot:\n%s\npatch:\n%s", filename, expect, applied, patch)
	}
}
