#!/usr/bin/env bash
set -u

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

section() { echo -e "\n${BLUE}==== $* ====${NC}"; }
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
err() { echo -e "${RED}[ERR]${NC} $*"; }
info() { echo -e "[INFO] $*"; }
cmd() { echo -e "${BLUE}$ $*${NC}"; bash -lc "$*"; local rc=$?; echo "[exit=$rc]"; return $rc; }
exists() { command -v "$1" >/dev/null 2>&1; }

section "Podstawowe informacje"
cmd 'date'
cmd 'uname -a'
cmd 'cat /etc/os-release 2>/dev/null || true'

section "Sprzęt PCI / GPU"
if exists lspci; then
  cmd "lspci -nnk | grep -EA4 'VGA|3D|Display'"
else
  warn "Brak lspci (pakiet pciutils)."
fi

section "Sterownik jądra AMDGPU"
if lsmod | grep -q '^amdgpu'; then
  ok "Moduł amdgpu jest załadowany."
  cmd "lsmod | grep '^amdgpu'"
else
  err "Moduł amdgpu NIE jest załadowany. ROCm nie zadziała bez amdgpu."
fi

cmd 'dmesg 2>/dev/null | grep -iE "amdgpu|kfd|firmware|vram|ring|ras|gfx" | tail -n 120 || true'

section "/dev/kfd i /dev/dri"
if [ -e /dev/kfd ]; then
  ok "/dev/kfd istnieje"
  cmd 'ls -l /dev/kfd'
else
  err "/dev/kfd nie istnieje - KFD/ROCm kernel interface nie jest dostępny"
fi

if [ -d /dev/dri ]; then
  ok "/dev/dri istnieje"
  cmd 'ls -l /dev/dri'
else
  err "/dev/dri nie istnieje"
fi

section "Grupy i uprawnienia użytkownika"
cmd 'id'
GROUPS_NOW="$(id -nG 2>/dev/null || true)"
case " $GROUPS_NOW " in
  *" render "*) ok "Użytkownik jest w grupie render" ;;
  *) warn "Użytkownik NIE jest w grupie render" ;;
esac
case " $GROUPS_NOW " in
  *" video "*) ok "Użytkownik jest w grupie video" ;;
  *) warn "Użytkownik NIE jest w grupie video" ;;
esac

section "Pakiety i narzędzia ROCm"
for x in rocminfo rocm-smi amd-smi hipconfig clinfo; do
  if exists "$x"; then
    ok "Znaleziono: $x -> $(command -v "$x")"
  else
    warn "Brak narzędzia: $x"
  fi
done

cmd 'dpkg -l 2>/dev/null | grep -i rocm || true'
cmd 'apt list --installed 2>/dev/null | grep -i rocm || true'

section "Wersja ROCm / HIP"
if exists hipconfig; then
  cmd 'hipconfig --full || hipconfig || true'
fi
if [ -f /opt/rocm/.info/version ]; then
  cmd 'cat /opt/rocm/.info/version'
elif [ -f /opt/rocm/.info/version-utils ]; then
  cmd 'cat /opt/rocm/.info/version-utils'
else
  warn 'Nie znaleziono pliku wersji ROCm w /opt/rocm/.info/'
fi

section "Wykrywanie GPU przez ROCm"
if exists rocminfo; then
  cmd 'rocminfo | sed -n "1,220p"'
  cmd 'rocminfo 2>/dev/null | grep -iE "Name:|Marketing Name|gfx|Agent" || true'
else
  warn 'Brak rocminfo - nie da się potwierdzić wykrycia GPU przez ROCm'
fi

if exists rocm-smi; then
  cmd 'rocm-smi || true'
fi
if exists amd-smi; then
  cmd 'amd-smi list || amd-smi static || true'
fi

section "OpenCL pomocniczo"
if exists clinfo; then
  cmd 'clinfo | sed -n "1,160p"'
else
  warn 'Brak clinfo'
fi

section "Zmienne środowiskowe mogące psuć detekcję"
cmd 'env | grep -E "ROCM|HIP|HSA|CUDA|GGML|LLAMA" | sort || true'

section "llama.cpp / binarki"
cmd 'pwd'
cmd 'find . -maxdepth 3 -type f \( -name "llama-cli" -o -name "main" -o -name "llama-server" -o -name "libggml*" \) 2>/dev/null | sort || true'
cmd 'find . -maxdepth 4 -type f \( -name "CMakeCache.txt" -o -name "build.ninja" \) 2>/dev/null | sort || true'
cmd 'grep -RniE "GGML_HIP|GGML_CUDA|GGML_VULKAN|HIPBLAS|ROCM" . 2>/dev/null | head -n 120 || true'

section "Linkowanie binarki llama.cpp (jeśli istnieje)"
LLAMA_BIN=""
for cand in ./llama-cli ./build/bin/llama-cli ./main ./build/bin/main ./llama-server ./build/bin/llama-server; do
  if [ -x "$cand" ]; then
    LLAMA_BIN="$cand"
    break
  fi
done

if [ -n "$LLAMA_BIN" ]; then
  ok "Znaleziono binarkę: $LLAMA_BIN"
  cmd "ldd '$LLAMA_BIN' || true"
  cmd "strings '$LLAMA_BIN' | grep -iE 'ROCm|HIP|Vulkan|CUDA|hipblas|ggml' | head -n 80 || true"
  cmd "'$LLAMA_BIN' --version || '$LLAMA_BIN' -h || true"
else
  warn 'Nie znalazłem binarki llama.cpp w typowych ścieżkach.'
fi

section "Biblioteki ROCm w systemie"
cmd 'ldconfig -p 2>/dev/null | grep -iE "hip|roc|hsa|blas" | head -n 120 || true'
cmd 'find /opt/rocm -maxdepth 3 -type f 2>/dev/null | grep -iE "libamdhip64|libhipblas|libhsa-runtime|librocblas" | sort || true'

section "Test dostępu do urządzeń"
cmd 'test -r /dev/kfd && echo readable:/dev/kfd || echo not-readable:/dev/kfd'
cmd 'for x in /dev/dri/renderD*; do [ -e "$x" ] && { test -r "$x" && echo readable:$x || echo not-readable:$x; }; done'

section "Wnioski wstępne"
echo 'Interpretacja:'
echo '- Jeśli brak /dev/kfd albo amdgpu: problem jest na poziomie sterownika/kernela.'
echo '- Jeśli rocminfo nie pokazuje agenta gfx*: ROCm nie widzi GPU.'
echo '- Jeśli rocminfo działa, ale llama.cpp nie: problem jest zwykle w buildzie/linkowaniu backendu.'
echo '- Jeśli użytkownik nie jest w grupie render/video: może być problem z uprawnieniami do /dev/kfd lub /dev/dri.'
echo '- Jeśli karta to Radeon VII / Pro VII (gfx906): nowsze ROCm może już nie wspierać jej poprawnie i trzeba sprawdzić wersję stacku.'

echo
echo 'Gotowe. Wklej cały output albo plik loga z uruchomienia tego skryptu.'
