package globalref

import (
	"sort"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/hashicorp/terraform/internal/addrs"
)

func TestAnalyzerMetaReferences(t *testing.T) {
	tests := []struct {
		InputContainer string
		InputRef       string
		WantRefs       []string
	}{
		{
			``,
			`local.a`,
			nil,
		},
		{
			``,
			`local.single`,
			[]string{
				"::test_thing.single.id",
			},
		},
		{
			``,
			`test_thing.single`,
			[]string{
				"::local.a",
				"::local.b",
			},
		},
		{
			``,
			`test_thing.single.string`,
			[]string{
				"::local.a",
			},
		},
		{
			``,
			`test_thing.for_each`,
			[]string{
				"::local.a",
				"::test_thing.single.string",
			},
		},
		{
			``,
			`test_thing.for_each["whatever"]`,
			[]string{
				"::local.a",
				"::test_thing.single.string",
			},
		},
		{
			``,
			`test_thing.for_each["whatever"].single`,
			[]string{
				"::test_thing.single.string",
			},
		},
		{
			``,
			`test_thing.for_each["whatever"].single.z`,
			[]string{
				"::test_thing.single.string",
			},
		},
		{
			``,
			`test_thing.count`,
			[]string{
				"::local.a",
			},
		},
		{
			``,
			`test_thing.count[0]`,
			[]string{
				"::local.a",
			},
		},
		{
			``,
			`module.single.a`,
			[]string{
				"module.single::test_thing.foo",
				"module.single::var.a",
			},
		},
		{
			``,
			`module.for_each["whatever"].a`,
			[]string{
				`module.for_each["whatever"]::test_thing.foo`,
				`module.for_each["whatever"]::var.a`,
			},
		},
		{
			``,
			`module.count[0].a`,
			[]string{
				`module.count[0]::test_thing.foo`,
				`module.count[0]::var.a`,
			},
		},
		{
			`module.single`,
			`var.a`,
			[]string{
				"::test_thing.single",
			},
		},
		{
			`module.single`,
			`test_thing.foo`,
			[]string{
				"module.single::var.a",
			},
		},
	}

	azr := testAnalyzer(t, "assorted")

	for _, test := range tests {
		name := test.InputRef
		if test.InputContainer != "" {
			name = test.InputContainer + " " + test.InputRef
		}
		t.Run(name, func(t *testing.T) {
			t.Logf("testing %s", name)
			var containerAddr addrs.Targetable
			containerAddr = addrs.RootModuleInstance
			if test.InputContainer != "" {
				moduleAddrTarget, diags := addrs.ParseTargetStr(test.InputContainer)
				if diags.HasErrors() {
					t.Fatalf("input module address is invalid: %s", diags.Err())
				}
				containerAddr = moduleAddrTarget.Subject
			}

			localRef, diags := addrs.ParseRefStr(test.InputRef)
			if diags.HasErrors() {
				t.Fatalf("input reference is invalid: %s", diags.Err())
			}

			ref := Reference{
				ContainerAddr: containerAddr,
				LocalRef:      localRef,
			}

			refs := azr.MetaReferences(ref)

			want := test.WantRefs
			var got []string
			for _, ref := range refs {
				got = append(got, ref.DebugString())
			}
			sort.Strings(got)
			if diff := cmp.Diff(want, got); diff != "" {
				t.Errorf("wrong references\n%s", diff)
			}
		})
	}
}
