#!/usr/bin/env bash
# Pasang AI lokal (Ollama) TANPA root & TANPA API key, lalu set .env untuk AI Admin Agent.
# Pakai:  bash setup-local-ai.sh [folder-backend-yang-ada-.env]
# Opsi env: AI_AGENT_MODEL=qwen3:4b  AI_AGENT_NUM_CTX=16384  AI_AGENT_THREADS=8
set -e
BACKEND="${1:-$PWD}"
OLL_DIR="$HOME/ollama"
CTX="${AI_AGENT_NUM_CTX:-16384}"

echo "== Spek server =="
TOTAL=$(awk '/MemTotal/ {print int($2/1024)}' /proc/meminfo)
AVAIL=$(awk '/MemAvailable/ {print int($2/1024)}' /proc/meminfo)
EFF=$AVAIL; WHY="MemAvailable mesin"
# Hosting bersama (CloudLinux/cgroup) sering membatasi memori PER AKUN — ukur batas itu, bukan RAM mesin.
for f in /sys/fs/cgroup/memory.max /sys/fs/cgroup/memory/memory.limit_in_bytes; do
  if [ -r "$f" ]; then
    v=$(cat "$f" 2>/dev/null || true)
    if [ -n "$v" ] && [ "$v" != "max" ] && [ "$v" -lt 1000000000000 ] 2>/dev/null; then
      L=$((v/1024/1024)); if [ "$L" -lt "$EFF" ]; then EFF=$L; WHY="batas cgroup akun"; fi
    fi
    break
  fi
done
U=$(ulimit -v 2>/dev/null || echo unlimited)
if [ "$U" != "unlimited" ]; then UL=$((U/1024)); if [ "$UL" -lt "$EFF" ]; then EFF=$UL; WHY="ulimit -v akun"; fi; fi
# Override manual kalau tahu limit akunmu (lihat cPanel → Resource Usage → Physical Memory)
if [ -n "${AI_AGENT_MEM_LIMIT_MB:-}" ] && [ "$AI_AGENT_MEM_LIMIT_MB" -lt "$EFF" ]; then EFF=$AI_AGENT_MEM_LIMIT_MB; WHY="AI_AGENT_MEM_LIMIT_MB (manual)"; fi
# CloudLinux (hosting bersama) menyembunyikan limit dari dalam akun → angka di atas bisa menyesatkan.
if { [ -e /proc/lve ] || uname -r | grep -qi lve; } && [ -z "${AI_AGENT_MEM_LIMIT_MB:-}" ] && [ "${FORCE:-}" != "1" ]; then
  echo "⚠ Terdeteksi CloudLinux (hosting bersama): limit memori akun TIDAK terlihat dari terminal."
  echo "  Cek cPanel → Metrics → Resource Usage → Physical Memory, lalu jalankan ulang dengan mis.:"
  echo "    AI_AGENT_MEM_LIMIT_MB=2048 bash setup-local-ai.sh $BACKEND"
  echo "  (atau FORCE=1 untuk mengabaikan peringatan ini). Akun limit 2GB tidak cukup untuk model lokal — pakai setup-ai-server.sh di VPS."
  exit 1
fi
FREE_GB=$(df -P "$HOME" | awk 'NR==2{print int($4/1024/1024)}')
echo "RAM mesin: ${TOTAL} MB | tersedia: ${AVAIL} MB | batas efektif untuk akunmu: ${EFF} MB (${WHY})"
echo "CPU: $(nproc) core (terlihat) | Disk bebas di \$HOME: ${FREE_GB} GB"

if   [ "$EFF" -ge 12000 ]; then MODEL="qwen3:8b";   NEED=7
elif [ "$EFF" -ge 6500  ]; then MODEL="qwen3:4b";   NEED=4
elif [ "$EFF" -ge 3500  ]; then MODEL="qwen3:1.7b"; NEED=3
else
  echo "✗ Batas memori efektif ${EFF}MB terlalu kecil untuk model lokal yang layak (minimal ±4GB)."
  echo "  Opsi: minta hosting menaikkan limit memori akun, pakai VPS ≥8GB, atau jalankan Ollama di PC lain lalu isi AI_AGENT_BASE_URL."
  exit 1
fi
MODEL="${AI_AGENT_MODEL:-$MODEL}"
if [ "$FREE_GB" -lt "$NEED" ]; then echo "✗ Disk bebas ${FREE_GB}GB kurang (butuh ±${NEED}GB untuk $MODEL). Bersihkan disk dulu atau pilih model lebih kecil: AI_AGENT_MODEL=qwen3:1.7b"; exit 1; fi
echo "Model dipilih: $MODEL"

echo "== Pasang Ollama =="
if command -v ollama >/dev/null 2>&1; then OLLAMA="$(command -v ollama)"
elif [ -x "$OLL_DIR/bin/ollama" ]; then OLLAMA="$OLL_DIR/bin/ollama"
else
  mkdir -p "$OLL_DIR"; cd "$OLL_DIR"
  ARCH=$(uname -m); case "$ARCH" in x86_64) A=amd64;; aarch64|arm64) A=arm64;; *) echo "arsitektur $ARCH tidak didukung"; exit 1;; esac
  if command -v zstd >/dev/null 2>&1 && curl -fL -o o.tar.zst "https://ollama.com/download/ollama-linux-$A.tar.zst"; then
    tar --zstd -xf o.tar.zst && rm -f o.tar.zst
  else
    curl -fL -o o.tgz "https://ollama.com/download/ollama-linux-$A.tgz" && tar -xzf o.tgz && rm -f o.tgz
  fi
  OLLAMA="$OLL_DIR/bin/ollama"
  [ -x "$OLLAMA" ] || { echo "✗ Binary ollama tidak ketemu setelah ekstrak (atau /home dipasang noexec). Panduan manual: https://docs.ollama.com/linux"; exit 1; }
fi
echo "Ollama: $OLLAMA"

echo "== Script start (dipakai cron biar hidup 24 jam) =="
START="$HOME/start-ollama.sh"
cat > "$START" <<EOS
#!/usr/bin/env bash
pgrep -u "\$(id -u)" -x ollama >/dev/null && exit 0
export OLLAMA_HOST=127.0.0.1:11434 OLLAMA_CONTEXT_LENGTH=$CTX OLLAMA_KEEP_ALIVE=24h OLLAMA_NUM_PARALLEL=1 OLLAMA_MAX_LOADED_MODELS=1
nohup "$OLLAMA" serve >> "$HOME/ollama.log" 2>&1 &
EOS
chmod +x "$START"; "$START"

echo -n "Menunggu Ollama siap"
for i in $(seq 1 30); do curl -fs http://127.0.0.1:11434/api/version >/dev/null && break; echo -n "."; sleep 1; done; echo
curl -fs http://127.0.0.1:11434/api/version >/dev/null || { echo "✗ Ollama tidak mau start — cek ~/ollama.log"; exit 1; }

echo "== Unduh model $MODEL (sekali saja) =="
"$OLLAMA" pull "$MODEL"

echo "== Buat varian 'lonestar-agent' (konteks $CTX, thread dibatasi supaya tidak menghabiskan CPU hosting bersama) =="
CORES=$(nproc); T="${AI_AGENT_THREADS:-8}"; [ "$T" -gt "$CORES" ] && T="$CORES"
cat > "$HOME/Modelfile.lonestar" <<EOM
FROM $MODEL
PARAMETER num_ctx $CTX
PARAMETER num_thread $T
PARAMETER temperature 0.2
EOM
"$OLLAMA" create lonestar-agent -f "$HOME/Modelfile.lonestar"

echo "== Update .env =="
ENVF="$BACKEND/.env"; touch "$ENVF"
setenv() { if grep -q "^$1=" "$ENVF"; then sed -i "s|^$1=.*|$1=$2|" "$ENVF"; else echo "$1=$2" >> "$ENVF"; fi; }
setenv AI_AGENT_PROVIDER local
setenv AI_AGENT_MODEL lonestar-agent
setenv AI_AGENT_BASE_URL "http://127.0.0.1:11434/v1"
grep -q "^AI_AGENT_RUN_INFO=" "$ENVF" || echo "AI_AGENT_RUN_INFO=Hosting cPanel (Setup Node.js App / Passenger), app root $BACKEND, restart dengan touch tmp/restart.txt" >> "$ENVF"
if ! grep -q "^AI_AGENT_KEY=" "$ENVF"; then
  K=$(openssl rand -hex 24 2>/dev/null || head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n')
  echo "AI_AGENT_KEY=$K" >> "$ENVF"; echo ">>> AI_AGENT_KEY baru (masukkan di panel): $K"
else echo "AI_AGENT_KEY sudah ada di .env (tidak diubah)"; fi

echo
echo "✓ Selesai. Model dasar: $MODEL → dipakai agent sebagai 'lonestar-agent' (thread=$T)."
echo "Langkah berikut: pasang cron (cPanel → Cron Jobs, tiap 5 menit):  $START"
echo "Lalu restart aplikasi di cPanel → Setup Node.js App → Restart."
