package terraform

import (
	"strings"
	"testing"

	"github.com/hashicorp/terraform/internal/addrs"
)

func TestConfigTransformer_nilModule(t *testing.T) {
	g := Graph{Path: addrs.RootModuleInstance}
	tf := &ConfigTransformer{}
	if err := tf.Transform(&g); err != nil {
		t.Fatalf("err: %s", err)
	}

	if len(g.Vertices()) > 0 {
		t.Fatalf("graph is not empty: %s", g.String())
	}
}

func TestConfigTransformer(t *testing.T) {
	g := Graph{Path: addrs.RootModuleInstance}
	tf := &ConfigTransformer{Config: testModule(t, "graph-basic")}
	if err := tf.Transform(&g); err != nil {
		t.Fatalf("err: %s", err)
	}

	actual := strings.TrimSpace(g.String())
	expected := strings.TrimSpace(testConfigTransformerGraphBasicStr)
	if actual != expected {
		t.Fatalf("bad:\n\n%s", actual)
	}
}

func TestConfigTransformer_mode(t *testing.T) {
	g := Graph{Path: addrs.RootModuleInstance}
	tf := &ConfigTransformer{
		Config:     testModule(t, "transform-config-mode-data"),
		ModeFilter: true,
		Mode:       addrs.DataResourceMode,
	}
	if err := tf.Transform(&g); err != nil {
		t.Fatalf("err: %s", err)
	}

	actual := strings.TrimSpace(g.String())
	expected := strings.TrimSpace(`
data.aws_ami.foo
`)
	if actual != expected {
		t.Fatalf("bad:\n\n%s", actual)
	}
}

func TestConfigTransformer_nonUnique(t *testing.T) {
	g := Graph{Path: addrs.RootModuleInstance}
	g.Add(NewNodeAbstractResource(
		addrs.RootModule.Resource(
			addrs.ManagedResourceMode, "aws_instance", "web",
		),
	))
	tf := &ConfigTransformer{Config: testModule(t, "graph-basic")}
	if err := tf.Transform(&g); err != nil {
		t.Fatalf("err: %s", err)
	}

	actual := strings.TrimSpace(g.String())
	expected := strings.TrimSpace(`
aws_instance.web
aws_instance.web
aws_load_balancer.weblb
aws_security_group.firewall
openstack_floating_ip.random
`)
	if actual != expected {
		t.Fatalf("bad:\n\n%s", actual)
	}
}

const testConfigTransformerGraphBasicStr = `
aws_instance.web
aws_load_balancer.weblb
aws_security_group.firewall
openstack_floating_ip.random
`
