package addrs

import (
	"fmt"
	"strings"
	"testing"

	"github.com/go-test/deep"
)

func TestAbsOutputValueInstanceEqual_true(t *testing.T) {
	foo, diags := ParseModuleInstanceStr("module.foo")
	if len(diags) > 0 {
		t.Fatalf("unexpected diags: %s", diags.Err())
	}
	foobar, diags := ParseModuleInstanceStr("module.foo[1].module.bar")
	if len(diags) > 0 {
		t.Fatalf("unexpected diags: %s", diags.Err())
	}

	ovs := []AbsOutputValue{
		foo.OutputValue("a"),
		foobar.OutputValue("b"),
	}
	for _, r := range ovs {
		t.Run(r.String(), func(t *testing.T) {
			if !r.Equal(r) {
				t.Fatalf("expected %#v to be equal to itself", r)
			}
		})
	}
}

func TestAbsOutputValueInstanceEqual_false(t *testing.T) {
	foo, diags := ParseModuleInstanceStr("module.foo")
	if len(diags) > 0 {
		t.Fatalf("unexpected diags: %s", diags.Err())
	}
	foobar, diags := ParseModuleInstanceStr("module.foo[1].module.bar")
	if len(diags) > 0 {
		t.Fatalf("unexpected diags: %s", diags.Err())
	}

	testCases := []struct {
		left  AbsOutputValue
		right AbsOutputValue
	}{
		{
			foo.OutputValue("a"),
			foo.OutputValue("b"),
		},
		{
			foo.OutputValue("a"),
			foobar.OutputValue("a"),
		},
	}
	for _, tc := range testCases {
		t.Run(fmt.Sprintf("%s = %s", tc.left, tc.right), func(t *testing.T) {
			if tc.left.Equal(tc.right) {
				t.Fatalf("expected %#v not to be equal to %#v", tc.left, tc.right)
			}

			if tc.right.Equal(tc.left) {
				t.Fatalf("expected %#v not to be equal to %#v", tc.right, tc.left)
			}
		})
	}
}

func TestParseAbsOutputValueStr(t *testing.T) {
	tests := map[string]struct {
		want    AbsOutputValue
		wantErr string
	}{
		"module.foo": {
			wantErr: "An output name is required",
		},
		"module.foo.output": {
			wantErr: "An output name is required",
		},
		"module.foo.boop.beep": {
			wantErr: "Output address must start with \"output.\"",
		},
		"module.foo.output[0]": {
			wantErr: "An output name is required",
		},
		"output": {
			wantErr: "An output name is required",
		},
		"output[0]": {
			wantErr: "An output name is required",
		},
		"output.boop": {
			want: AbsOutputValue{
				Module: RootModuleInstance,
				OutputValue: OutputValue{
					Name: "boop",
				},
			},
		},
		"module.foo.output.beep": {
			want: AbsOutputValue{
				Module: mustParseModuleInstanceStr("module.foo"),
				OutputValue: OutputValue{
					Name: "beep",
				},
			},
		},
	}

	for input, tc := range tests {
		t.Run(input, func(t *testing.T) {
			got, diags := ParseAbsOutputValueStr(input)
			for _, problem := range deep.Equal(got, tc.want) {
				t.Errorf(problem)
			}
			if len(diags) > 0 {
				gotErr := diags.Err().Error()
				if tc.wantErr == "" {
					t.Errorf("got error, expected success: %s", gotErr)
				} else if !strings.Contains(gotErr, tc.wantErr) {
					t.Errorf("unexpected error\n got: %s\nwant: %s", gotErr, tc.wantErr)
				}
			} else {
				if tc.wantErr != "" {
					t.Errorf("got success, expected error: %s", tc.wantErr)
				}
			}
		})
	}
}
