#!/usr/bin/env bash

# ---------------- total memory ----------------

read mem_total mem_avail < <(
    awk '
      /MemTotal:/     {t=$2}
      /MemAvailable:/ {a=$2}
      END {print t, a}
    ' /proc/meminfo
)

total_used_kb=$((mem_total - mem_avail))

# ---------------- java ----------------

java_used_kb=$(
    awk '
      /^Name:/ {
          name=$2
          is_java = (name ~ /^java/)
      }
      /^VmRSS:/ && is_java {
          sum += $2
      }
      END {print sum+0}
    ' /proc/*/status
)

# ---------------- war thunder ----------------

aces_used_kb=$(
    awk '
      /^Name:/ {
          is_aces = ($2 == "aces")
      }
      /^VmRSS:/ && is_aces {
          sum += $2
      }
      END {print sum+0}
    ' /proc/*/status
)

# ---------------- firefox (ram + tabs) ----------------

read firefox_used_kb firefox_tabs < <(
    for p in /proc/[0-9]*; do
        exe=$(readlink -f "$p/exe" 2>/dev/null) || continue

        # Match all Firefox executables (Arch-safe)
        [[ $exe == *"/firefox"* ]] || continue

        rss=$(awk '/^VmRSS:/ {print $2}' "$p/status")
        comm=$(cat "$p/comm" 2>/dev/null)

        # Count tab/content processes
        if [[ $comm == "Web Content" || $comm == "Isolated Web Co" ]]; then
            echo "$rss 1"
        else
            echo "$rss 0"
        fi
    done | awk '
        { rss += $1; tabs += $2 }
        END { print rss+0, tabs+0 }
    '
)



# ---------------- kernel memory ----------------

read slab sreclaimable page_tables kernel_stack < <(
    awk '
      /Slab:/        {slab=$2}
      /SReclaimable:/{sr=$2}
      /PageTables:/  {pt=$2}
      /KernelStack:/ {ks=$2}
      END {print slab+0, sr+0, pt+0, ks+0}
    ' /proc/meminfo
)

kernel_mem_kb=$((slab + sreclaimable + page_tables + kernel_stack))

# ---------------- kworkers ----------------

kworker_used_kb=$(
    awk '
      /^Name:/ {is_kworker = ($2 ~ /^kworker/)}
      /^VmRSS:/ && is_kworker {
          sum += $2
      }
      END {print sum+0}
    ' /proc/*/status
)

# ---------------- system services (root daemons) ----------------

services_used_kb=$(
    awk '
      /^Uid:/ {uid = $2}
      /^Name:/ {
          name = $2
          is_kernel = (name ~ /^\[/)
      }
      /^VmRSS:/ && uid == 0 && !is_kernel {
          sum += $2
      }
      END {print sum+0}
    ' /proc/*/status
)

# ---------------- desktop (hyprland, audio, etc.) ----------------

desktop_used_kb=$(
    for p in /proc/[0-9]*; do
        exe=$(readlink -f "$p/exe" 2>/dev/null) || continue

        case "$exe" in
            /usr/bin/Hyprland|\
            /usr/bin/waybar|\
            /usr/bin/pipewire|\
            /usr/bin/pipewire-pulse|\
            /usr/lib/wireplumber/*|\
            /usr/lib/xdg-desktop-portal|\
            /usr/lib/xdg-desktop-portal-*|\
            /usr/bin/dbus-daemon)
                awk '/^VmRSS:/ {print $2}' "$p/status"
                ;;
        esac
    done | awk '{sum += $1} END {print sum+0}'
)


# ---------------- final OS RAM ----------------

os_used_kb=$((kernel_mem_kb + kworker_used_kb + services_used_kb))

# ---------------- formatting ----------------

fmt_mem() {
    local kb=$1
    if (( kb < 1024*1024 )); then
        LC_NUMERIC=C printf "%6.0f MB" \
            "$(LC_NUMERIC=C bc <<< "scale=0; $kb / 1024")"
    else
        LC_NUMERIC=C printf "%6.2f GB" \
            "$(LC_NUMERIC=C bc <<< "scale=2; $kb / 1024 / 1024")"
    fi
}

# ---------------- output ----------------

printf "Total RAM used:          %s\n" "$(fmt_mem "$total_used_kb")"

if (( firefox_used_kb > 0 )); then
    printf "Firefox RAM used:        %s (%d tabs)\n" \
        "$(fmt_mem "$firefox_used_kb")" "$firefox_tabs"
fi

if (( java_used_kb > 0 )); then
    printf "Java RAM used:           %s\n" "$(fmt_mem "$java_used_kb")"
fi

if (( aces_used_kb > 0 )); then
    printf "War Thunder RAM used:    %s\n" "$(fmt_mem "$aces_used_kb")"
fi

printf "Desktop RAM used:        %s\n" "$(fmt_mem "$desktop_used_kb")"
printf "OS RAM used:             %s\n" "$(fmt_mem "$os_used_kb")"

