//go:build darwin

package runtimeproc

import (
	"context"
	"os/exec"
	"strconv"
	"strings"
	"time"
)

type platformManager struct{}

// NewPlatformManager returns the macOS process manager used by Janitor.
func NewPlatformManager() Manager { return platformManager{} }

func (platformManager) ListProcesses(ctx context.Context) ([]ProcessInfo, error) {
	cmd := exec.CommandContext(ctx, "ps", "-axo", "pid=,ppid=,pgid=,lstart=,comm=,command=")
	out, err := cmd.Output()
	if err != nil {
		return nil, err
	}
	var processes []ProcessInfo
	for _, line := range strings.Split(string(out), "\n") {
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}
		fields := strings.Fields(line)
		if len(fields) < 9 {
			continue
		}
		pid, err := strconv.Atoi(fields[0])
		if err != nil || pid <= 0 {
			continue
		}
		ppid, _ := strconv.Atoi(fields[1])
		pgid, _ := strconv.Atoi(fields[2])
		startedAt, _ := time.ParseInLocation("Mon Jan _2 15:04:05 2006", strings.Join(fields[3:8], " "), time.Local)
		exe := fields[8]
		cmdline := ""
		if len(fields) > 9 {
			cmdline = strings.Join(fields[9:], " ")
		}
		processes = append(processes, ProcessInfo{PID: pid, PPID: ppid, PGID: pgid, Exe: exe, Cmdline: cmdline, StartedAt: startedAt})
	}
	return processes, nil
}
