#!/usr/bin/env bash
set -euo pipefail

LLAMA_DIR="/home/adminek/llama.cpp"
BUILD_DIR="$LLAMA_DIR/build"
LOG_FILE="${LOG_FILE:-$HOME/llama_rebuild.log}"
JOBS="${JOBS:-$(nproc)}"

exec 3>&1
log(){ echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE" >&3; }
run(){ log "RUN: $*"; bash -lc "$*" >>"$LOG_FILE" 2>&1; }

if [[ ! -d "$LLAMA_DIR" ]]; then
  log "Nie znaleziono katalogu: $LLAMA_DIR"
  exit 1
fi

: > "$LOG_FILE"
log "Start przebudowy llama.cpp pod ROCm/gfx906 bez hipBLAS"
log "Katalog źródeł: $LLAMA_DIR"
log "Katalog build: $BUILD_DIR"
log "Log: $LOG_FILE"

export ROCM_PATH=/opt/rocm
export PATH="$ROCM_PATH/bin:$PATH"
export LD_LIBRARY_PATH="$ROCM_PATH/lib:$ROCM_PATH/lib64:${LD_LIBRARY_PATH:-}"

log "Krok 1: weryfikacja ROCm"
run "test -x /opt/rocm/bin/rocminfo"
run "/opt/rocm/bin/rocminfo | grep -A20 'Name:                    gfx906'"
run "ls /opt/rocm/lib/rocblas/library/TensileLibrary*gfx906*.dat >/dev/null"

log "Krok 2: usunięcie starego build"
run "rm -rf '$BUILD_DIR'"
run "mkdir -p '$BUILD_DIR'"

log "Krok 3: konfiguracja CMake"
run "cd '$LLAMA_DIR' && cmake -S '$LLAMA_DIR' -B '$BUILD_DIR' -DCMAKE_BUILD_TYPE=Release -DGGML_HIP=ON -DGGML_HIPBLAS=OFF -DAMDGPU_TARGETS=gfx906"

log "Krok 4: kompilacja głównych targetów"
run "cmake --build '$BUILD_DIR' --config Release --parallel '$JOBS' --target llama-cli llama-server llama-bench"

log "Krok 5: wyszukanie wygenerowanych plików"
run "find '$BUILD_DIR' -type f \( -name 'llama-cli' -o -name 'llama-server' -o -name 'llama-bench' -o -name 'libllama.so' \) | sort"

log "Krok 6: kontrola typowych ścieżek"
run "ls -l '$BUILD_DIR/bin' 2>/dev/null || true"
run "ls -l '$BUILD_DIR/bin/Release' 2>/dev/null || true"

log "Gotowe. Najczęściej binarki są w $BUILD_DIR/bin albo $BUILD_DIR/bin/Release."
log "Uruchamiaj po: source /etc/profile.d/rocm.sh"
