// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0

package main

import (
	"fmt"
	"sort"
	"strings"

	"source.monogon.dev/go/clitable"
	apb "source.monogon.dev/metropolis/proto/api"
	cpb "source.monogon.dev/metropolis/proto/common"
	"source.monogon.dev/version"
)

func nodeEntry(n *apb.Node) clitable.Entry {
	res := clitable.Entry{}

	res.Add("node id", n.Id)
	state := n.State.String()
	state = strings.ReplaceAll(state, "NODE_STATE_", "")
	res.Add("state", state)
	address := "unknown"
	if n.Status != nil && n.Status.ExternalAddress != "" {
		address = n.Status.ExternalAddress
	}
	res.Add("address", address)

	health := n.Health.String()
	health = strings.ReplaceAll(health, "HEALTH_", "")
	res.Add("health", health)

	var roles []string
	if n.Roles.ConsensusMember != nil {
		roles = append(roles, "ConsensusMember")
	}
	if n.Roles.KubernetesController != nil {
		roles = append(roles, "KubernetesController")
	}
	if n.Roles.KubernetesWorker != nil {
		roles = append(roles, "KubernetesWorker")
	}
	sort.Strings(roles)
	res.Add("roles", strings.Join(roles, ","))

	tpm := "unk"
	switch n.TpmUsage {
	case cpb.NodeTPMUsage_NODE_TPM_USAGE_PRESENT_AND_USED:
		tpm = "yes"
	case cpb.NodeTPMUsage_NODE_TPM_USAGE_PRESENT_BUT_UNUSED:
		tpm = "unused"
	case cpb.NodeTPMUsage_NODE_TPM_USAGE_NOT_PRESENT:
		tpm = "no"
	}
	res.Add("tpm", tpm)

	if n.Status != nil && n.Status.Version != nil {
		res.Add("version", version.Semver(n.Status.Version))
	}

	tshs := n.TimeSinceHeartbeat.GetSeconds()
	res.Add("heartbeat", fmt.Sprintf("%ds", tshs))

	if l := n.Labels; l != nil {
		var labels []string
		for _, pair := range l.Pairs {
			labels = append(labels, fmt.Sprintf("%s:%s", pair.Key, pair.Value))
		}
		res.Add("labels", strings.Join(labels, ","))
	}

	return res
}
