#!/usr/bin/env bash
# system-info.sh - one-screen system report for Linux and macOS.
# READ-ONLY: prints to the terminal, changes nothing.
# Run: bash system-info.sh

set -u

echo "=== System Report ==="
echo "Host        : $(hostname 2>/dev/null || echo unknown)"
echo "OS          : $(uname -s) $(uname -r) ($(uname -m))"
if [ "$(uname -s)" = "Linux" ] && [ -r /proc/uptime ]; then
  up=$(awk '{printf "%.1f", $1/3600}' /proc/uptime)
  echo "Uptime      : ${up} h"
elif command -v uptime >/dev/null 2>&1; then
  echo "Uptime      :$(uptime | sed 's/.*up //; s/,.*load.*//')"
fi

echo ""
echo "--- CPU ---"
if [ "$(uname -s)" = "Linux" ] && [ -r /proc/cpuinfo ]; then
  model=$(awk -F': ' '/model name/ {print $2; exit}' /proc/cpuinfo)
  cores=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo 0)
  echo "Model       : ${model:-unknown}"
  echo "Cores       : ${cores:-unknown}"
elif command -v sysctl >/dev/null 2>&1; then
  echo "Model       : $(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo unknown)"
  echo "Cores       : $(sysctl -n hw.ncpu 2>/dev/null || echo unknown)"
else
  echo "Model       : (not reported on this system)"
fi

echo ""
echo "--- Memory ---"
if [ "$(uname -s)" = "Linux" ] && [ -r /proc/meminfo ]; then
  total_kb=$(awk '/MemTotal/ {print $2; exit}' /proc/meminfo)
  avail_kb=$(awk '/MemAvailable/ {print $2; exit}' /proc/meminfo)
  [ -z "$avail_kb" ] && avail_kb=$(awk '/MemFree/ {print $2; exit}' /proc/meminfo)
  if [ -n "$total_kb" ] && [ -n "$avail_kb" ]; then
    total=$(awk -v k="$total_kb" 'BEGIN {printf "%.2f", k/1048576}')
    used=$(awk -v t="$total_kb" -v a="$avail_kb" 'BEGIN {printf "%.2f", (t-a)/1048576}')
    pct=$(awk -v t="$total_kb" -v a="$avail_kb" 'BEGIN {if (t>0) printf "%.1f", (t-a)*100/t; else print "0.0"}')
    echo "Total       : ${total} GB"
    echo "In use      : ${used} GB"
    echo "Usage       : ${pct}%"
  else
    echo "(not reported on this system)"
  fi
elif command -v sysctl >/dev/null 2>&1; then
  total=$(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.2f", $1/1073741824}')
  echo "Total       : ${total:-unknown} GB"
else
  echo "(not reported on this system)"
fi

echo ""
echo "--- Disks ---"
df -kP 2>/dev/null | awk 'NR>1 && $1 !~ /^(tmpfs|devfs|map|shm|overlay)/ && $2 ~ /^[0-9]+$/ && !seen[$NF]++ {
  cap=$5; gsub(/%/,"",cap);
  printf "%-20s %8.1f GB total %8.1f GB free %3.0f%% used\n", $NF, $2/1048576, $4/1048576, cap+0
}' || echo "(df unavailable here)"

echo ""
echo "--- Network (IPv4) ---"
if command -v ip >/dev/null 2>&1; then
  ip -4 -o addr show 2>/dev/null | awk '{printf "%-30s %s\n", $2, $4}' | sed 's|/.*||'
elif command -v ifconfig >/dev/null 2>&1; then
  ifconfig 2>/dev/null | awk '/inet / && $2 != "127.0.0.1" {printf "%-30s %s\n", $1, $2}' | sed 's|addr:||'
else
  echo "(install iproute2 or net-tools for interface details)"
fi

echo ""
echo "Read-only report - nothing was changed on this machine."