package main

import (
	"fmt"
	"io"
	"log"
	"os"
	"sort"
	"strings"

	"source.monogon.dev/metropolis/node/core/identity"
	apb "source.monogon.dev/metropolis/proto/api"
	cpb "source.monogon.dev/metropolis/proto/common"
)

type encoder struct {
	out io.WriteCloser
}

func (e *encoder) writeNodeID(n *apb.Node) error {
	id := identity.NodeID(n.Pubkey)
	_, err := fmt.Fprintf(e.out, "%s\n", id)
	return err
}

func (e *encoder) writeNode(n *apb.Node) error {
	id := identity.NodeID(n.Pubkey)
	if _, err := fmt.Fprintf(e.out, "%s", id); err != nil {
		return err
	}

	state := cpb.NodeState_name[int32(n.State)]
	if _, err := fmt.Fprintf(e.out, "\t%s", state); err != nil {
		return err
	}

	addr := n.Status.ExternalAddress
	if _, err := fmt.Fprintf(e.out, "\t%s", addr); err != nil {
		return err
	}

	health := apb.Node_Health_name[int32(n.Health)]
	if _, err := fmt.Fprintf(e.out, "\t%s", health); err != nil {
		return err
	}

	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)
	if _, err := fmt.Fprintf(e.out, "\t%s", strings.Join(roles, ",")); err != nil {
		return err
	}

	tshs := n.TimeSinceHeartbeat.GetSeconds()
	if _, err := fmt.Fprintf(e.out, "\t%ds\n", tshs); err != nil {
		return err
	}
	return nil
}

func (e *encoder) close() error {
	if e.out != os.Stdout {
		return e.out.Close()
	}
	return nil
}

func newOutputEncoder() *encoder {
	var o io.WriteCloser
	o = os.Stdout

	// Redirect output to the file at flags.output, if the flag was provided.
	if flags.output != "" {
		of, err := os.Create(flags.output)
		if err != nil {
			log.Fatalf("Couldn't create the output file at %s: %v", flags.output, err)
		}
		o = of
	}

	if flags.format != "plaintext" {
		log.Fatalf("Currently only the plaintext output format is supported.")
	}
	return &encoder{
		out: o,
	}
}
