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

APP_VERSION="1.0.5"
APP_DIR="/opt/qmscreen"
DATA_DIR="${QMSCREEN_HOME:-${XDG_DATA_HOME:-$HOME/.local/share}/qmscreen}"
VENV_DIR="${QMSCREEN_VENV:-$DATA_DIR/venv}"
MARKER="$VENV_DIR/.qmscreen_deps_${APP_VERSION}"
PYTHON_BIN="${QMSCREEN_PYTHON:-python3}"

mkdir -p "$DATA_DIR"

if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
  echo "[ERROR] Python 3 tidak ditemukan. Instal paket python3 terlebih dahulu." >&2
  exit 2
fi

if [ ! -x "$VENV_DIR/bin/python" ]; then
  echo "[QMScreen] Membuat virtual environment: $VENV_DIR"
  if ! "$PYTHON_BIN" -m venv "$VENV_DIR"; then
    echo "[ERROR] Gagal membuat virtual environment." >&2
    echo "        Jalankan: sudo apt update && sudo apt install python3-venv python3-pip" >&2
    exit 3
  fi
fi

PY="$VENV_DIR/bin/python"
PIP=("$PY" -m pip)

echo "[QMScreen] Menyiapkan pip/setuptools/wheel..."
"${PIP[@]}" install --disable-pip-version-check --upgrade pip setuptools wheel

if [ ! -f "$MARKER" ]; then
  echo "[QMScreen] Menginstal dependency ilmiah dan antarmuka. Proses pertama dapat memerlukan beberapa menit..."
  "${PIP[@]}" install --disable-pip-version-check --prefer-binary -r "$APP_DIR/requirements.txt"

  # TBLite adalah backend opsional. Kegagalan tidak boleh menggagalkan instalasi utama.
  echo "[QMScreen] Mencoba memasang backend opsional TBLite/GFN2-xTB..."
  if ! "${PIP[@]}" install --disable-pip-version-check --prefer-binary tblite; then
    echo "[WARNING] TBLite tidak tersedia untuk Python/platform ini. QMScreen tetap dapat berjalan; GFN2-xTB memerlukan TBLite atau executable xtb." >&2
  fi

  touch "$MARKER"
else
  echo "[QMScreen] Dependency V${APP_VERSION} sudah siap."
fi

# Seed katalog pengguna hanya bila belum ada. Aplikasi juga memiliki fallback internal.
if [ ! -f "$DATA_DIR/upload_molekul.json" ] && [ -f "$APP_DIR/upload_molekul.json" ]; then
  cp "$APP_DIR/upload_molekul.json" "$DATA_DIR/upload_molekul.json"
fi

cat <<MSG
[OK] QMScreen V${APP_VERSION} siap.
     Jalankan: qmscreen
     Akses  : http://localhost:${QMSCREEN_PORT:-8501}
MSG
