// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package hclwrite

import (
	"fmt"
	"strings"
)

type TestTreeNode struct {
	Type string
	Val  string

	Children []TestTreeNode
}

func makeTestTree(n *node) (root TestTreeNode) {
	const us = "hclwrite."
	const usPtr = "*hclwrite."
	root.Type = fmt.Sprintf("%T", n.content)
	if strings.HasPrefix(root.Type, us) {
		root.Type = root.Type[len(us):]
	} else if strings.HasPrefix(root.Type, usPtr) {
		root.Type = root.Type[len(usPtr):]
	}

	type WithVal interface {
		testValue() string
	}
	hasTestVal := false
	if withVal, ok := n.content.(WithVal); ok {
		root.Val = withVal.testValue()
		hasTestVal = true
	}

	n.content.walkChildNodes(func(n *node) {
		root.Children = append(root.Children, makeTestTree(n))
	})

	// If we didn't end up with any children then this is probably a leaf
	// node, so we'll set its content value to it raw bytes if we didn't
	// already set a test value.
	if !hasTestVal && len(root.Children) == 0 {
		toks := n.content.BuildTokens(nil)
		root.Val = toks.testValue()
	}

	return root
}
