#!/bin/sh
set -eu

APP_NAME="probe-deck"
SYSTEM_BIN="/usr/lib/probe-deck/${APP_NAME}"
USER_DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/${APP_NAME}"
USER_BIN_DIR="${USER_DATA_DIR}/bin"
USER_BIN="${USER_BIN_DIR}/${APP_NAME}"
SYSTEM_HASH_FILE="${USER_BIN_DIR}/.system-binary.sha256"

hash_file() {
  sha256sum "$1" | awk '{print $1}'
}

have_hash_tools() {
  command -v sha256sum >/dev/null 2>&1 && command -v awk >/dev/null 2>&1
}

bootstrap_user_binary() {
  mkdir -p "$USER_BIN_DIR"
  cp "$SYSTEM_BIN" "$USER_BIN"
  chmod 0755 "$USER_BIN"
  if have_hash_tools; then
    hash_file "$SYSTEM_BIN" > "$SYSTEM_HASH_FILE"
  fi
}

sync_user_binary_on_package_upgrade() {
  have_hash_tools || return 0
  [ -f "$SYSTEM_HASH_FILE" ] || return 0

  current_system_hash="$(hash_file "$SYSTEM_BIN")"
  previous_system_hash="$(cat "$SYSTEM_HASH_FILE" 2>/dev/null || true)"
  [ -n "$previous_system_hash" ] || return 0
  [ "$previous_system_hash" = "$current_system_hash" ] && return 0

  current_user_hash="$(hash_file "$USER_BIN")"
  if [ "$current_user_hash" = "$previous_system_hash" ]; then
    cp "$SYSTEM_BIN" "$USER_BIN"
    chmod 0755 "$USER_BIN"
  fi
  printf '%s\n' "$current_system_hash" > "$SYSTEM_HASH_FILE"
}

if [ ! -x "$SYSTEM_BIN" ]; then
  echo "probe-deck: packaged binary not found at $SYSTEM_BIN" >&2
  exit 1
fi

if [ "${PROBEDECK_USE_SYSTEM_BINARY:-}" = "1" ]; then
  exec "$SYSTEM_BIN" "$@"
fi

if [ -n "${HOME:-}" ]; then
  if [ ! -x "$USER_BIN" ]; then
    if ! bootstrap_user_binary; then
      exec "$SYSTEM_BIN" "$@"
    fi
  else
    sync_user_binary_on_package_upgrade || true
  fi
  exec "$USER_BIN" "$@"
fi

exec "$SYSTEM_BIN" "$@"
