package utils

import (
	"strings"
	"time"

	"github.com/weaveworks/scope/report"
)

// Prune returns a copy of the Nodes with all information not strictly
// necessary for rendering nodes and edges in the UI cut away.
func Prune(nodes report.Nodes) report.Nodes {
	result := report.Nodes{}
	for id, node := range nodes {
		result[id] = PruneNode(node)
	}
	return result
}

// PruneNode returns a copy of the Node with all information not strictly
// necessary for rendering nodes and edges stripped away. Specifically, that
// means cutting out parts of the Node.
func PruneNode(node report.Node) report.Node {
	prunedChildren := report.MakeNodeSet()
	node.Children.ForEach(func(child report.Node) {
		prunedChildren = prunedChildren.Add(PruneNode(child))
	})
	prunedNode := report.MakeNode(
		node.ID).
		WithTopology(node.Topology).
		WithAdjacent(node.Adjacency...).
		WithChildren(prunedChildren)
	// Copy counters across, but with zero timestamp so they compare equal
	node.Latest.ForEach(func(k string, _ time.Time, v string) {
		if strings.HasPrefix(k, report.CounterPrefix) {
			prunedNode.Latest = prunedNode.Latest.Set(k, time.Time{}, v)
		}
	})
	return prunedNode
}
