#!/bin/sh
# m-metrics - uso de CPU y memoria, en porcentaje, separados por tabulador.
#
# La CPU no se puede medir con una sola lectura: /proc/stat da contadores
# acumulados desde el arranque, así que hace falta comparar dos momentos.
# En vez de dormir dentro del script (cada consulta costaría esa espera), se
# guarda la lectura anterior y se compara con la nueva. La primera llamada
# devuelve 0 y a partir de la segunda el dato es real.
set -u

ESTADO="${XDG_RUNTIME_DIR:-/tmp}/.m-metrics"

# --- CPU -------------------------------------------------------------------
# Formato: cpu  user nice system idle iowait irq softirq steal ...
leer_cpu() {
    awk '/^cpu /{
        total = 0
        for (i = 2; i <= NF; i++) total += $i
        # idle + iowait: tiempo en el que la CPU no hizo trabajo útil
        print total, $5 + $6
        exit
    }' /proc/stat
}

set -- $(leer_cpu)
TOTAL_NUEVO="${1:-0}"
OCIO_NUEVO="${2:-0}"

CPU=0
if [ -r "$ESTADO" ]; then
    # shellcheck disable=SC2046
    set -- $(cat "$ESTADO" 2>/dev/null)
    TOTAL_VIEJO="${1:-0}"
    OCIO_VIEJO="${2:-0}"
    CPU="$(awk -v tn="$TOTAL_NUEVO" -v on="$OCIO_NUEVO" \
               -v tv="$TOTAL_VIEJO" -v ov="$OCIO_VIEJO" 'BEGIN {
        dt = tn - tv
        do_ = on - ov
        if (dt <= 0) { print 0; exit }
        u = (dt - do_) * 100 / dt
        if (u < 0) u = 0
        if (u > 100) u = 100
        printf "%d", u + 0.5
    }')"
fi
printf '%s %s\n' "$TOTAL_NUEVO" "$OCIO_NUEVO" > "$ESTADO" 2>/dev/null || true

# --- Memoria ---------------------------------------------------------------
# MemAvailable es la cifra honesta: MemFree deja fuera la caché reclamable y
# haría parecer que el sistema está sin memoria cuando no lo está.
MEM="$(awk '
    /^MemTotal:/     { total = $2 }
    /^MemAvailable:/ { disp  = $2 }
    END {
        if (total > 0) printf "%d", (total - disp) * 100 / total + 0.5
        else print 0
    }' /proc/meminfo)"

printf '%s\t%s\n' "$CPU" "$MEM"
