package tsnet

import (
	"context"
	"fmt"
	"log"
	"strings"
	"tailscale.com/tailcfg"
	"tailscale.com/types/key"

	"go4.org/mem"
)

// Returns the raw hostinfo for a peer based on node ID.
func (s *TSAgent) GetStatusForPeer(id string) (*tailcfg.HostinfoView, error) {
	if !strings.HasPrefix(id, "nodekey:") {
		return nil, fmt.Errorf("invalid node ID")
	}

	if s.Debug {
		log.Printf("querying peer state for %s", id)
	}

	status, err := s.Lc.Status(context.Background())
	if err != nil {
		return nil, fmt.Errorf("failed to get status: %w", err)
	}

	nodeKey, err := key.ParseNodePublicUntyped(mem.S(id[8:]))
	peer := status.Peer[nodeKey]
	if peer == nil {
		return nil, nil
	}

	ip := peer.TailscaleIPs[0].String()
	whois, err := s.Lc.WhoIs(context.Background(), ip)
	if err != nil {
		return nil, fmt.Errorf("failed to get whois: %w", err)
	}

	return &whois.Node.Hostinfo, nil
}
