package collector

import (
	"strconv"
)

type MemoryInfo struct {
	TotalBytes int64 `json:"total_bytes"`
	UsedBytes  int64 `json:"used_bytes"`
	FreeBytes  int64 `json:"free_bytes"`
}

func CollectMemory() MemoryInfo {
	info := MemoryInfo{}

	// Gesamter physischer Speicher
	if v, err := strconv.ParseInt(sysctlGet("hw.physmem"), 10, 64); err == nil {
		info.TotalBytes = v
	}

	// Freier Speicher berechnen via vm.stats.vm
	pageSize := int64(4096)
	if v, err := strconv.ParseInt(sysctlGet("hw.pagesize"), 10, 64); err == nil && v > 0 {
		pageSize = v
	}

	// Freie + inactive + cache Pages
	freePages, _ := strconv.ParseInt(sysctlGet("vm.stats.vm.v_free_count"), 10, 64)
	inactivePages, _ := strconv.ParseInt(sysctlGet("vm.stats.vm.v_inactive_count"), 10, 64)

	info.FreeBytes = (freePages + inactivePages) * pageSize
	info.UsedBytes = info.TotalBytes - info.FreeBytes

	if info.UsedBytes < 0 {
		info.UsedBytes = 0
	}
	if info.FreeBytes < 0 {
		info.FreeBytes = 0
	}

	return info
}
