#!/bin/sh
set -eu

BASE_URL="https://stoicsoft.net/phonerc/downloads"
INSTALL_DIR="${PHONERC_COMPANION_HOME:-$HOME/.local/share/phonerc-companion}"

case "$(uname -s)" in
  Darwin) PLATFORM="macos" ;;
  Linux) PLATFORM="linux" ;;
  *) echo "This installer supports macOS and Linux." >&2; exit 1 ;;
esac
if [ "$PLATFORM" = "macos" ] && [ "$(uname -m)" != "arm64" ]; then
  echo "The current macOS Companion helper supports Apple silicon Macs only." >&2
  exit 1
fi

PYTHON="$(command -v python3 || true)"
if [ -z "$PYTHON" ] || ! "$PYTHON" -c 'import sys; raise SystemExit(sys.version_info < (3, 8))'; then
  echo "Python 3.8 or newer is required. Install Python, then try again." >&2
  exit 1
fi
for tool in curl unzip; do
  command -v "$tool" >/dev/null 2>&1 || { echo "$tool is required." >&2; exit 1; }
done
if [ "$PLATFORM" = "linux" ] && ! command -v git >/dev/null 2>&1; then
  echo "git is required to install the Linux Bluetooth dependency." >&2
  exit 1
fi

TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT HUP INT TERM
echo "Downloading PhoneRC Companion for $PLATFORM..."
curl --fail --location --proto '=https' --tlsv1.2 \
  "$BASE_URL/phonerc-companion-$PLATFORM.zip" --output "$TMP_DIR/companion.zip"
unzip -q "$TMP_DIR/companion.zip" -d "$TMP_DIR/outer"
INNER_ZIP="$(find "$TMP_DIR/outer" -type f -name '*.zip' -print -quit)"
if [ -n "$INNER_ZIP" ]; then
  unzip -q "$INNER_ZIP" -d "$TMP_DIR/package"
  SOURCE_DIR="$TMP_DIR/package/shortcut-launcher"
else
  SOURCE_DIR="$TMP_DIR/outer/shortcut-launcher"
fi
[ -f "$SOURCE_DIR/shortcut_launcher.py" ] || { echo "Invalid download." >&2; exit 1; }

mkdir -p "$INSTALL_DIR"
if [ -f "$INSTALL_DIR/config.json" ]; then
  cp "$INSTALL_DIR/config.json" "$TMP_DIR/config.json"
fi
cp -R "$SOURCE_DIR/." "$INSTALL_DIR/"
if [ -f "$TMP_DIR/config.json" ]; then
  cp "$TMP_DIR/config.json" "$INSTALL_DIR/config.json"
fi
if [ "$PLATFORM" = "macos" ]; then
  PACKAGED_HELPER="$INSTALL_DIR/macos-helper/PhoneRCCompanionHelper"
  RUNTIME_HELPER="$INSTALL_DIR/macos-helper/.build/release/PhoneRCCompanionHelper"
  [ -f "$PACKAGED_HELPER" ] || { echo "The macOS helper is missing from the package." >&2; exit 1; }
  mkdir -p "$(dirname "$RUNTIME_HELPER")"
  cp "$PACKAGED_HELPER" "$RUNTIME_HELPER"
  chmod +x "$RUNTIME_HELPER"
  # Copying an ad-hoc-signed executable can cause macOS to reject the new
  # inode. Re-sign it locally before the launcher's capability probe runs.
  codesign --force --sign - --timestamp=none "$RUNTIME_HELPER"
fi
"$PYTHON" -m venv "$INSTALL_DIR/.venv"
VENV_PYTHON="$INSTALL_DIR/.venv/bin/python"
"$VENV_PYTHON" -m pip install --disable-pip-version-check -r "$INSTALL_DIR/requirements.txt"
SELF_TEST_OUTPUT="$($VENV_PYTHON "$INSTALL_DIR/shortcut_launcher.py" --self-test)"
printf '%s\n' "$SELF_TEST_OUTPUT"
printf '%s\n' "$SELF_TEST_OUTPUT" | grep -q '^companion supported: yes$' || {
  echo "PhoneRC Companion prerequisites are incomplete; automatic startup was not configured." >&2
  exit 1
}
mkdir -p "$INSTALL_DIR/logs"

if [ "$PLATFORM" = "macos" ]; then
  AGENT_DIR="$HOME/Library/LaunchAgents"
  AGENT_FILE="$AGENT_DIR/net.stoicsoft.phonerc-companion.plist"
  mkdir -p "$AGENT_DIR"
  sed -e "s|__PYTHON__|$VENV_PYTHON|g" -e "s|__DIR__|$INSTALL_DIR|g" > "$AGENT_FILE" <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>net.stoicsoft.phonerc-companion</string>
<key>ProgramArguments</key><array><string>__PYTHON__</string><string>-u</string><string>__DIR__/shortcut_launcher.py</string><string>--both</string><string>--verbose</string></array>
<key>WorkingDirectory</key><string>__DIR__</string>
<key>RunAtLoad</key><true/><key>KeepAlive</key><true/>
<key>StandardOutPath</key><string>__DIR__/logs/companion.log</string>
<key>StandardErrorPath</key><string>__DIR__/logs/companion-error.log</string>
</dict></plist>
EOF
  launchctl bootout "gui/$(id -u)" "$AGENT_FILE" >/dev/null 2>&1 || true
  launchctl bootstrap "gui/$(id -u)" "$AGENT_FILE"
  "$VENV_PYTHON" -c 'from ApplicationServices import AXIsProcessTrustedWithOptions, kAXTrustedCheckOptionPrompt; AXIsProcessTrustedWithOptions({kAXTrustedCheckOptionPrompt: True})' || true
  echo "Installed and started. Approve the macOS Accessibility request so PhoneRC can paste text and handle hotkeys."
else
  if command -v systemctl >/dev/null 2>&1; then
    SERVICE_DIR="$HOME/.config/systemd/user"
    mkdir -p "$SERVICE_DIR"
    sed -e "s|__PYTHON__|$VENV_PYTHON|g" -e "s|__DIR__|$INSTALL_DIR|g" > "$SERVICE_DIR/phonerc-companion.service" <<'EOF'
[Unit]
Description=PhoneRC Companion
[Service]
Type=simple
WorkingDirectory=__DIR__
ExecStart=__PYTHON__ __DIR__/shortcut_launcher.py --both
Restart=on-failure
[Install]
WantedBy=default.target
EOF
    systemctl --user daemon-reload
    systemctl --user enable --now phonerc-companion.service
  else
    mkdir -p "$HOME/.config/autostart"
    cat > "$HOME/.config/autostart/phonerc-companion.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=PhoneRC Companion
Exec=$VENV_PYTHON $INSTALL_DIR/shortcut_launcher.py --both
Path=$INSTALL_DIR
Terminal=false
X-GNOME-Autostart-enabled=true
EOF
    "$VENV_PYTHON" "$INSTALL_DIR/shortcut_launcher.py" --both >/dev/null 2>&1 &
  fi
  echo "Installed and started. Install xdotool if text paste does not work."
fi
echo "Installed at: $INSTALL_DIR"
