package ctrld

import (
	"bufio"
	"bytes"
	"context"
	"io"
	"os/exec"
	"strings"
)

// ValidInterfaces returns a set of all valid hardware ports.
func ValidInterfaces(_ context.Context) map[string]struct{} {
	b, err := exec.Command("networksetup", "-listallhardwareports").Output()
	if err != nil {
		return nil
	}
	return parseListAllHardwarePorts(bytes.NewReader(b))
}

// parseListAllHardwarePorts parses output of "networksetup -listallhardwareports"
// and returns map presents all hardware ports.
func parseListAllHardwarePorts(r io.Reader) map[string]struct{} {
	m := make(map[string]struct{})
	scanner := bufio.NewScanner(r)
	for scanner.Scan() {
		line := scanner.Text()
		after, ok := strings.CutPrefix(line, "Device: ")
		if !ok {
			continue
		}
		m[after] = struct{}{}
	}
	return m
}
