package jsonchecks

import (
	"fmt"

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

type staticObjectAddr map[string]interface{}

func makeStaticObjectAddr(addr addrs.ConfigCheckable) staticObjectAddr {
	ret := map[string]interface{}{
		"to_display": addr.String(),
	}

	switch addr := addr.(type) {
	case addrs.ConfigResource:
		if kind := addr.CheckableKind(); kind != addrs.CheckableResource {
			// Something has gone very wrong
			panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
		}

		ret["kind"] = "resource"
		switch addr.Resource.Mode {
		case addrs.ManagedResourceMode:
			ret["mode"] = "managed"
		case addrs.DataResourceMode:
			ret["mode"] = "data"
		default:
			panic(fmt.Sprintf("unsupported resource mode %#v", addr.Resource.Mode))
		}
		ret["type"] = addr.Resource.Type
		ret["name"] = addr.Resource.Name
		if !addr.Module.IsRoot() {
			ret["module"] = addr.Module.String()
		}
	case addrs.ConfigOutputValue:
		if kind := addr.CheckableKind(); kind != addrs.CheckableOutputValue {
			// Something has gone very wrong
			panic(fmt.Sprintf("%T has CheckableKind %s", addr, kind))
		}

		ret["kind"] = "output_value"
		ret["name"] = addr.OutputValue.Name
		if !addr.Module.IsRoot() {
			ret["module"] = addr.Module.String()
		}
	default:
		panic(fmt.Sprintf("unsupported ConfigCheckable implementation %T", addr))
	}

	return ret
}

type dynamicObjectAddr map[string]interface{}

func makeDynamicObjectAddr(addr addrs.Checkable) dynamicObjectAddr {
	ret := map[string]interface{}{
		"to_display": addr.String(),
	}

	switch addr := addr.(type) {
	case addrs.AbsResourceInstance:
		if !addr.Module.IsRoot() {
			ret["module"] = addr.Module.String()
		}
		if addr.Resource.Key != addrs.NoKey {
			ret["instance_key"] = addr.Resource.Key
		}
	case addrs.AbsOutputValue:
		if !addr.Module.IsRoot() {
			ret["module"] = addr.Module.String()
		}
	default:
		panic(fmt.Sprintf("unsupported Checkable implementation %T", addr))
	}

	return ret
}
