package discovery

import (
	"os"
	"path/filepath"
	"reflect"
	"testing"
)

func TestFindPluginPaths(t *testing.T) {
	got := findPluginPaths(
		"foo",
		[]string{
			"testdata/current-style-plugins/mockos_mockarch",
			"testdata/legacy-style-plugins",
			"testdata/non-existent",
			"testdata/not-a-dir",
		},
	)
	want := []string{
		filepath.Join("testdata", "current-style-plugins", "mockos_mockarch", "terraform-foo-bar_v0.0.1"),
		filepath.Join("testdata", "current-style-plugins", "mockos_mockarch", "terraform-foo-bar_v1.0.0.exe"),
		// un-versioned plugins are still picked up, even in current-style paths
		filepath.Join("testdata", "current-style-plugins", "mockos_mockarch", "terraform-foo-missing-version"),
		filepath.Join("testdata", "legacy-style-plugins", "terraform-foo-bar"),
		filepath.Join("testdata", "legacy-style-plugins", "terraform-foo-baz"),
	}

	// Turn the paths back into relative paths, since we don't care exactly
	// where this code is present on the system for the sake of this test.
	baseDir, err := os.Getwd()
	if err != nil {
		// Should never happen
		panic(err)
	}
	for i, absPath := range got {
		if !filepath.IsAbs(absPath) {
			t.Errorf("got non-absolute path %s", absPath)
		}

		got[i], err = filepath.Rel(baseDir, absPath)
		if err != nil {
			t.Fatalf("Can't make %s relative to current directory %s", absPath, baseDir)
		}
	}

	if !reflect.DeepEqual(got, want) {
		t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, want)
	}
}

func TestResolvePluginPaths(t *testing.T) {
	got := ResolvePluginPaths([]string{
		"/example/mockos_mockarch/terraform-foo-bar_v0.0.1",
		"/example/mockos_mockarch/terraform-foo-baz_v0.0.1",
		"/example/mockos_mockarch/terraform-foo-baz_v1.0.0",
		"/example/mockos_mockarch/terraform-foo-baz_v2.0.0_x4",
		"/example/mockos_mockarch/terraform-foo-upper_V2.0.0_X4",
		"/example/terraform-foo-bar",
		"/example/mockos_mockarch/terraform-foo-bar_vbananas",
		"/example/mockos_mockarch/terraform-foo-bar_v",
		"/example/mockos_mockarch/terraform-foo-windowsthing1_v1.0.0.exe",
		"/example/mockos_mockarch/terraform-foo-windowsthing2_v1.0.0_x4.exe",
		"/example/mockos_mockarch/terraform-foo-windowsthing3.exe",
		"/example2/mockos_mockarch/terraform-foo-bar_v0.0.1",
	})

	want := []PluginMeta{
		{
			Name:    "bar",
			Version: "0.0.1",
			Path:    "/example/mockos_mockarch/terraform-foo-bar_v0.0.1",
		},
		{
			Name:    "baz",
			Version: "0.0.1",
			Path:    "/example/mockos_mockarch/terraform-foo-baz_v0.0.1",
		},
		{
			Name:    "baz",
			Version: "1.0.0",
			Path:    "/example/mockos_mockarch/terraform-foo-baz_v1.0.0",
		},
		{
			Name:    "baz",
			Version: "2.0.0",
			Path:    "/example/mockos_mockarch/terraform-foo-baz_v2.0.0_x4",
		},
		{
			Name:    "upper",
			Version: "2.0.0",
			Path:    "/example/mockos_mockarch/terraform-foo-upper_V2.0.0_X4",
		},
		{
			Name:    "bar",
			Version: "0.0.0",
			Path:    "/example/terraform-foo-bar",
		},
		{
			Name:    "bar",
			Version: "bananas",
			Path:    "/example/mockos_mockarch/terraform-foo-bar_vbananas",
		},
		{
			Name:    "bar",
			Version: "",
			Path:    "/example/mockos_mockarch/terraform-foo-bar_v",
		},
		{
			Name:    "windowsthing1",
			Version: "1.0.0",
			Path:    "/example/mockos_mockarch/terraform-foo-windowsthing1_v1.0.0.exe",
		},
		{
			Name:    "windowsthing2",
			Version: "1.0.0",
			Path:    "/example/mockos_mockarch/terraform-foo-windowsthing2_v1.0.0_x4.exe",
		},
		{
			Name:    "windowsthing3",
			Version: "0.0.0",
			Path:    "/example/mockos_mockarch/terraform-foo-windowsthing3.exe",
		},
	}

	for p := range got {
		t.Logf("got %#v", p)
	}

	if got, want := got.Count(), len(want); got != want {
		t.Errorf("got %d items; want %d", got, want)
	}

	for _, wantMeta := range want {
		if !got.Has(wantMeta) {
			t.Errorf("missing meta %#v", wantMeta)
		}
	}
}
