#!/usr/bin/env bash
#
# Vibe Terminal Server — one-line installer for macOS and Linux (incl. WSL).
#
# Hosted on the website; users paste:
#   curl -fsSL <site>/install.sh | bash
#
# Behavior:
#   - macOS / desktop Linux: installs the tray (ui) build to ~/.vterm/bin and
#     prints how to launch it.
#   - WSL or headless Linux: installs the headless build and registers a
#     systemd USER service so vterm-server starts at login.
#
# Environment overrides:
#   VTERM_DOWNLOAD_BASE  release download base (default: GitLab latest)
#   VTERM_VERSION        release tag for the base URL (default: permalink/latest)
#   VTERM_ARTIFACT       full artifact file name override
#   VTERM_NO_SERVICE=1   install the headless binary without the user service
#
# The script is non-interactive on purpose: it must run from `curl | bash`,
# where stdin is the script itself.

set -euo pipefail

DOWNLOAD_BASE="${VTERM_DOWNLOAD_BASE:-https://gitlab.aurga.cn/vibe-terminal/vibe-terminal/-/releases}"
VERSION="${VTERM_VERSION:-permalink/latest}"
INSTALL_DIR="${HOME}/.vterm/bin"
SERVICE_NAME="vterm-server"
UNIT_FILE="${HOME}/.config/systemd/user/${SERVICE_NAME}.service"

log()  { printf '\033[1;32m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33mWarning:\033[0m %s\n' "$*"; }
die()  { printf '\033[1;31mError:\033[0m %s\n' "$*" >&2; exit 1; }

# ── Environment detection ────────────────────────────────────────────────
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$ARCH" in
    x86_64|amd64) ARCH="x86_64" ;;
    aarch64|arm64) ARCH="aarch64" ;;
    *) die "unsupported architecture: $ARCH" ;;
esac

is_wsl() {
    [ -n "${WSL_DISTRO_NAME:-}" ] || [ -n "${WSL_INTEROP:-}" ] && return 0
    grep -qi microsoft /proc/version 2>/dev/null || \
        grep -qi microsoft /proc/sys/kernel/osrelease 2>/dev/null
}

case "$OS" in
    Linux)
        if is_wsl; then
            PROFILE="wsl"
        elif [ -z "${DISPLAY:-}" ] && [ -z "${WAYLAND_DISPLAY:-}" ]; then
            PROFILE="headless"
        else
            PROFILE="desktop"
        fi
        ;;
    Darwin)
        PROFILE="macos"
        ;;
    *)
        die "unsupported OS: $OS (this installer covers macOS and Linux/WSL)"
        ;;
esac

if [ "$PROFILE" = "wsl" ] || [ "$PROFILE" = "headless" ]; then
    VARIANT="headless"
else
    VARIANT="ui"
fi

log "Detected: $OS $ARCH ($PROFILE) → $VARIANT build"

# ── Download ─────────────────────────────────────────────────────────────
if [ -n "${VTERM_ARTIFACT:-}" ]; then
    ARTIFACT="$VTERM_ARTIFACT"
elif [ "$OS" = "Darwin" ]; then
    ARTIFACT="vterm-server-macos-${ARCH}.tar.gz"
else
    ARTIFACT="vterm-server-${VARIANT}-linux-${ARCH}.tar.gz"
fi
URL="${DOWNLOAD_BASE}/${VERSION}/downloads/${ARTIFACT}"

command -v curl >/dev/null 2>&1 || command -v wget >/dev/null 2>&1 \
    || die "neither curl nor wget found; install one and retry"

TMPDIR_INSTALL="$(mktemp -d)"
trap 'rm -rf "$TMPDIR_INSTALL"' EXIT

log "Downloading $URL"
if command -v curl >/dev/null 2>&1; then
    curl -fSL --retry 3 -o "${TMPDIR_INSTALL}/${ARTIFACT}" "$URL" \
        || die "download failed — check the release exists for ${ARCH}"
else
    wget -q --tries=3 -O "${TMPDIR_INSTALL}/${ARTIFACT}" "$URL" \
        || die "download failed — check the release exists for ${ARCH}"
fi

tar -xzf "${TMPDIR_INSTALL}/${ARTIFACT}" -C "$TMPDIR_INSTALL"
BIN_SRC="$(find "$TMPDIR_INSTALL" -type f -name vterm-server -perm -u+x | head -n 1)"
[ -n "$BIN_SRC" ] || BIN_SRC="$(find "$TMPDIR_INSTALL" -type f -name vterm-server | head -n 1)"
[ -n "$BIN_SRC" ] || die "archive does not contain a vterm-server binary"

# ── Install binary ───────────────────────────────────────────────────────
mkdir -p "$INSTALL_DIR"
install -m 0755 "$BIN_SRC" "${INSTALL_DIR}/vterm-server"
log "Installed: ${INSTALL_DIR}/vterm-server"
"$INSTALL_DIR/vterm-server" --version || true

# PATH hint in ~/.profile (guarded, appended once).
PROFILE_RC="${HOME}/.profile"
if [ -f "$HOME/.bashrc" ] && [ ! -f "$PROFILE_RC" ]; then
    PROFILE_RC="$HOME/.bashrc"
fi
case ":${PATH}:" in
    *":${INSTALL_DIR}:"*) ;;
    *)
        if ! grep -q 'VTERM_PATH' "$PROFILE_RC" 2>/dev/null; then
            {
                printf '\n# VTERM_PATH\nexport PATH="$HOME/.vterm/bin:$PATH"\n'
            } >> "$PROFILE_RC"
            log "Added ~/.vterm/bin to PATH via $PROFILE_RC"
        fi
        ;;
esac

# ── Headless/WSL: systemd user service ───────────────────────────────────
if [ "$VARIANT" = "headless" ] && [ -z "${VTERM_NO_SERVICE:-}" ]; then
    if ! command -v systemctl >/dev/null 2>&1; then
        warn "systemctl not found; start the server manually:"
        warn "  ${INSTALL_DIR}/vterm-server"
    elif ! systemctl --user status >/dev/null 2>&1; then
        warn "systemd user session is not available."
        if [ "$PROFILE" = "wsl" ]; then
            warn "Enable systemd in WSL: add to /etc/wsl.conf then 'wsl --shutdown' from Windows:"
            warn "  [boot]\n  systemd=true"
        fi
        warn "Until then, start the server manually:"
        warn "  ${INSTALL_DIR}/vterm-server"
    else
        mkdir -p "$(dirname "$UNIT_FILE")"
        cat > "$UNIT_FILE" <<EOF
[Unit]
Description=Vibe Terminal Server (headless)
After=network.target

[Service]
ExecStart=${INSTALL_DIR}/vterm-server
Restart=on-failure
RestartSec=3

[Install]
WantedBy=default.target
EOF
        systemctl --user daemon-reload
        systemctl --user enable --now "${SERVICE_NAME}.service"
        log "User service installed and started (starts at every login)"
        # Best effort: start at boot even before an interactive login
        # (WSL VM boot, headless box after reboot).
        loginctl enable-linger "$USER" 2>/dev/null \
            || warn "could not enable lingering; the service starts on first login"
    fi
fi

# ── Next steps ───────────────────────────────────────────────────────────
printf '\n'
log "Next steps:"
log "  Open the Web UI:      ~/.vterm/bin/vterm-server --open"
log "  Pair a client:        ~/.vterm/bin/vterm-server --share"
if [ "$PROFILE" = "wsl" ]; then
    log "  From Windows, the Web UI is also at http://localhost:8780"
    log "  (WSL2 forwards localhost to Windows automatically.)"
fi
printf '\n'
