#!/bin/bash
# Wrapper so Astra/.desktop clicks show errors instead of silent exit.
set -u

BIN=""
if [[ -x /opt/metavpn/metavpn ]]; then
  BIN=/opt/metavpn/metavpn
elif [[ -x /opt/metavpn/metavpn_android ]]; then
  BIN=/opt/metavpn/metavpn_android
fi

LOG_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/metavpn"
mkdir -p "$LOG_DIR" 2>/dev/null || LOG_DIR="/tmp"
LOG="$LOG_DIR/launch.log"
{
  echo "===== $(date -Is 2>/dev/null || date) ====="
  echo "user=${USER:-} display=${DISPLAY:-} wayland=${WAYLAND_DISPLAY:-} xdg=${XDG_SESSION_TYPE:-}"
  if [[ -r /etc/os-release ]]; then
    # shellcheck disable=SC1091
    . /etc/os-release
    echo "os=${PRETTY_NAME:-unknown}"
  fi
  echo "glibc=$(ldd --version 2>/dev/null | head -1)"
  echo "bin=$BIN args=$*"
} >>"$LOG" 2>/dev/null || true

notify_err() {
  local msg="$1"
  printf '%s\n' "$msg" >>"$LOG" 2>/dev/null || true
  if [[ -z "${DISPLAY:-}${WAYLAND_DISPLAY:-}" ]]; then
    return
  fi
  if command -v zenity >/dev/null 2>&1; then
    zenity --error --no-markup --title="MetaVPN" --width=520 --text="$msg" 2>/dev/null && return
  fi
  if command -v kdialog >/dev/null 2>&1; then
    kdialog --error "$msg" 2>/dev/null && return
  fi
  if command -v notify-send >/dev/null 2>&1; then
    notify-send -u critical "MetaVPN" "$msg" 2>/dev/null && return
  fi
  if command -v xmessage >/dev/null 2>&1; then
    xmessage -center "MetaVPN: $msg" 2>/dev/null && return
  fi
}

if [[ -z "$BIN" ]]; then
  notify_err "Бинарник не найден (/opt/metavpn/metavpn). Переустановите metavpn-astra.deb"
  exit 127
fi

# Wake the root helper without a password prompt.
mkdir -p /var/lib/metavpn/trigger 2>/dev/null || true
: >/var/lib/metavpn/trigger/want 2>/dev/null || true
: >/tmp/metavpn-want-helper 2>/dev/null || true
if [[ -x /usr/libexec/metavpn/metavpn-priv ]]; then
  /usr/libexec/metavpn/metavpn-priv ensure >/dev/null 2>&1 || \
    sudo -n /usr/libexec/metavpn/metavpn-priv ensure >/dev/null 2>&1 || true
elif [[ -x /opt/metavpn/bin/metavpn-priv ]]; then
  /opt/metavpn/bin/metavpn-priv ensure >/dev/null 2>&1 || \
    sudo -n /opt/metavpn/bin/metavpn-priv ensure >/dev/null 2>&1 || true
elif [[ -x /opt/metavpn/bin/metavpn-ctl ]]; then
  sudo -n /opt/metavpn/bin/metavpn-ctl ensure >/dev/null 2>&1 || true
fi

# Safe defaults for Astra / old Mesa / Fly WM.
if [[ -z "${METAVPN_FORCE_GL:-}" ]]; then
  export GDK_BACKEND="${GDK_BACKEND:-x11}"
  export LIBGL_ALWAYS_SOFTWARE="${LIBGL_ALWAYS_SOFTWARE:-1}"
  export GSK_RENDERER="${GSK_RENDERER:-cairo}"
fi

LDD_OUT="$(ldd "$BIN" 2>&1 || true)"
printf '%s\n' "$LDD_OUT" >>"$LOG" 2>/dev/null || true

# glibc too old: "version `GLIBC_2.34' not found" — NOT a missing .so
if printf '%s\n' "$LDD_OUT" | grep -q "version \`GLIBC_"; then
  NEED="$(printf '%s\n' "$LDD_OUT" | grep -o 'GLIBC_[0-9.]*' | sort -Vu | tail -1)"
  HAVE="$(ldd --version 2>/dev/null | head -1)"
  notify_err "Системная glibc слишком старая для MetaVPN.
Нужна ${NEED:-GLIBC_2.35}+ (собрано под Ubuntu 22.04).
Сейчас: ${HAVE:-неизвестно}

Нужна Astra/Debian с glibc >= 2.35 (у вас в логе будет точная версия).
Лог: $LOG"
  exit 127
fi

# Real missing libs: "libfoo.so.0 => not found"
MISSING="$(printf '%s\n' "$LDD_OUT" | awk '/=> not found/ {print $1}' | tr '\n' ' ')"
if [[ -n "${MISSING// }" ]]; then
  notify_err "Не хватает библиотек: ${MISSING}
Лог: $LOG"
  exit 127
fi

# Keep shell (no exec) so .desktop launches can show a dialog on crash.
set +e
"$BIN" "$@" >>"$LOG" 2>&1
STATUS=$?
set -e

if [[ "$STATUS" -ne 0 ]]; then
  TAIL="$(tail -n 25 "$LOG" 2>/dev/null || true)"
  notify_err "MetaVPN не запустился (код $STATUS).
Лог: $LOG

$TAIL"
fi
exit "$STATUS"
