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

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

exec 3>&1
log(){ echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE" >&3; }
run(){ log "RUN: $*"; bash -lc "$*" >>"$LOG_FILE" 2>&1; return $?; }
fail(){ log "BŁĄD: $*"; log "Sprawdź log: $LOG_FILE"; exit 1; }

if [[ ! -d "$LLAMA_DIR" ]]; then
  echo "Nie znaleziono katalogu: $LLAMA_DIR" >&2
  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 "ROCM_ROOT: $ROCM_ROOT"
log "Log: $LOG_FILE"

export ROCM_PATH="$ROCM_ROOT"
export PATH="$ROCM_PATH/bin:$PATH"
export LD_LIBRARY_PATH="$ROCM_PATH/lib:$ROCM_PATH/lib64:${LD_LIBRARY_PATH:-}"
export HIP_PATH="$ROCM_ROOT"
export HIP_ROOT_DIR="$ROCM_ROOT"

log "Krok 1: weryfikacja ROCm"
run "test -x '$ROCM_ROOT/bin/rocminfo'" || fail "Brak $ROCM_ROOT/bin/rocminfo"
run "'$ROCM_ROOT/bin/rocminfo' | grep -A20 'Name:                    gfx906'" || fail "ROCm nie widzi gfx906"
run "ls '$ROCM_ROOT'/lib/rocblas/library/TensileLibrary*gfx906*.dat >/dev/null" || fail "Brak TensileLibrary dla gfx906"

log "Krok 2: usunięcie starego build"
run "rm -rf '$BUILD_DIR'" || fail "Nie udało się usunąć $BUILD_DIR"
run "mkdir -p '$BUILD_DIR'" || fail "Nie udało się utworzyć $BUILD_DIR"

log "Krok 3: konfiguracja CMake"
if ! run "cd '$LLAMA_DIR' && cmake -S '$LLAMA_DIR' -B '$BUILD_DIR' -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH='$ROCM_ROOT' -DROCM_ROOT='$ROCM_ROOT' -DHIP_ROOT='$ROCM_ROOT' -DHIP_PATH='$ROCM_ROOT' -DGGML_HIP=ON -DGGML_HIPBLAS=OFF -DAMDGPU_TARGETS=gfx906"; then
  log "Pierwsza konfiguracja CMake nie powiodła się. Próbuję wariantu ze starszą flagą LLAMA_HIPBLAS=OFF."
  run "rm -rf '$BUILD_DIR' && mkdir -p '$BUILD_DIR'" || fail "Nie udało się odtworzyć $BUILD_DIR"
  if ! run "cd '$LLAMA_DIR' && cmake -S '$LLAMA_DIR' -B '$BUILD_DIR' -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH='$ROCM_ROOT' -DROCM_ROOT='$ROCM_ROOT' -DHIP_ROOT='$ROCM_ROOT' -DHIP_PATH='$ROCM_ROOT' -DGGML_HIP=ON -DLLAMA_HIPBLAS=OFF -DAMDGPU_TARGETS=gfx906"; then
    log "Konfiguracja nadal nieudana. Pokażę końcówkę logu CMake."
    tail -n 120 "$LOG_FILE" >&3 || true
    fail "CMake zakończył się błędem na kroku 3"
  fi
fi

log "Krok 4: lista targetów (pomocniczo)"
run "cmake --build '$BUILD_DIR' --target help | tail -n 120" || true

log "Krok 5: kompilacja targetów"
if ! run "cmake --build '$BUILD_DIR' --config Release --parallel '$JOBS' --target llama-cli llama-server llama-bench"; then
  log "Jawne targety nie zadziałały. Próbuję pełnego build całego projektu."
  if ! run "cmake --build '$BUILD_DIR' --config Release --parallel '$JOBS'"; then
    tail -n 120 "$LOG_FILE" >&3 || true
    fail "Build zakończył się błędem"
  fi
fi

log "Krok 6: 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' -o -name 'main' \) | sort" || true

log "Krok 7: 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. Jeśli binarki nie są w build/bin, sprawdź listę plików wypisaną w logu."
log "Uruchamiaj po: source /etc/profile.d/rocm.sh"
