#!/usr/bin/env bash
# medir-debug.sh — cuánto pesa REALMENTE la info de depuración en el store. Etapa 3 del SDD 23.
#
# ── POR QUÉ NO BASTA EL «79%» QUE SE VENÍA CITANDO ─────────────────────────────────────────────
# Ese número era «el 79% del CONTENIDO BINARIO son secciones .debug_*», medido sobre una muestra de
# `.so`/`.a`. Es cierto y es engañoso para planificar, porque un artefacto NO es sólo binarios: trae
# cabeceras, datos, iconos, locales, `.pc`, documentación. El ahorro que importa es sobre el TAMAÑO
# DEL ARTEFACTO, y ése es necesariamente menor.
#
# El piloto lo confirmó: bison bajó 6M→3M (−50%) y appstream 56M→18M (−68%), los dos lejos del 79%.
# Extrapolar con la cifra bonita habría prometido ~96 G de ahorro y entregado bastante menos.
#
# ── EL MÉTODO ──────────────────────────────────────────────────────────────────────────────────
# Para cada artefacto: sumar el tamaño de las secciones `.debug_*` de cada ELF (`readelf -S`, que da
# los tamaños reales) y compararlo con el tamaño total del árbol. No reconstruye nada, así que se
# puede correr sobre cientos de artefactos en minutos en vez de días.
#
# Uso:   scripts/medir-debug.sh [N]     (N = cuántos artefactos muestrear, def 120)
set -uo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
STORE="${STORE:-./store}"; N="${1:-120}"

tot_kb=0; dbg_kb=0; n=0
printf "%-30s %10s %10s %6s\n" "artefacto" "total" "debug" "%"
for d in $(ls -d "$STORE"/*/ 2>/dev/null | shuf -n "$N" --random-source=/dev/urandom); do
  [ -d "$d" ] || continue
  t=$(du -sk "$d" 2>/dev/null | cut -f1); [ -n "$t" ] || continue
  # Sumar .debug_* de todos los ELF del árbol. `readelf -S` imprime tamaños en hex.
  b=$(find "$d" -type f \( -perm -u+x -o -name '*.so*' -o -name '*.a' \) 2>/dev/null | while read -r f; do
        readelf -S "$f" 2>/dev/null | awk '/\.debug_/{getline; print strtonum("0x" $1)}'
      done | awk '{s+=$1} END{print int(s/1024)}')
  b=${b:-0}
  [ "$t" -eq 0 ] && continue
  n=$((n+1)); tot_kb=$((tot_kb+t)); dbg_kb=$((dbg_kb+b))
  pct=$(( b * 100 / t ))
  [ "$pct" -ge 40 ] && printf "%-30s %9sK %9sK %5s%%\n" "$(basename "$d" | cut -c66-95)" "$t" "$b" "$pct"
done

echo "──────────────────────────────────────────────────────────────"
echo "  artefactos medidos: $n"
echo "  total: $((tot_kb/1024)) MB · debug: $((dbg_kb/1024)) MB"
[ "$tot_kb" -gt 0 ] && echo "  ⇒ la info de depuración es el $(( dbg_kb * 100 / tot_kb ))% del TAMAÑO DE ARTEFACTO"
echo "  (el «79%» que se citaba era sobre el contenido BINARIO, no sobre el artefacto — ver cabecera)"
