#!/usr/bin/env bash
# local-ai-bridge server/agent one-liner installer
# Usage:
#   curl -fsSL https://HOST/install/server.sh | bash -s -- \
#     --token 'lab_ag_...' --local HOST:PORT --relay HOST:PORT
set -euo pipefail

BASE_URL="https://local-ai-bridge-manager.srv1663152.hstgr.cloud"
TOKEN=""
NAME="$(hostname -s 2>/dev/null || echo lab-agent)"
LOCAL_AI="127.0.0.1:18000"
RELAY="127.0.0.1:17422"
BIN_URL="${LAB_AGENT_BIN_URL:-}"
PREFIX="${HOME}/.local"
CONFIG_DIR="${HOME}/.config/local-ai-bridge"
UNIT_DIR="${HOME}/.config/systemd/user"

usage() {
  cat <<EOF
Install lab-agent (server side) for local-ai-bridge

  curl -fsSL ${BASE_URL}/install/server.sh | bash -s -- \\
    --token 'lab_ag_...' --name home-gpu --local 127.0.0.1:18000 --relay 127.0.0.1:17422

Options:
  --token TOKEN     Agent token (lab_ag_... or LAB_AGENT_TOKEN) [required]
  --name NAME       Tunnel name (default: hostname)
  --local HOST:PORT Local AI HTTP (default: 127.0.0.1:18000)
  --relay HOST:PORT Relay control endpoint (default: 127.0.0.1:17422)
  --bin-url URL     Download URL for lab-agent binary
  --prefix DIR      Install prefix (default: ~/.local)
  -h, --help
EOF
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --token) TOKEN="${2:-}"; shift 2 ;;
    --name) NAME="${2:-}"; shift 2 ;;
    --local) LOCAL_AI="${2:-}"; shift 2 ;;
    --relay) RELAY="${2:-}"; shift 2 ;;
    --bin-url) BIN_URL="${2:-}"; shift 2 ;;
    --prefix) PREFIX="${2:-}"; shift 2 ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown arg: $1" >&2; usage; exit 1 ;;
  esac
done

if [[ -z "$TOKEN" ]]; then
  TOKEN="${LAB_AGENT_TOKEN:-}"
fi
if [[ -z "$TOKEN" ]]; then
  echo "ERROR: pass --token 'lab_ag_...' (create server in manager Admin UI)" >&2
  exit 1
fi

mkdir -p "$CONFIG_DIR" "${PREFIX}/bin" "$UNIT_DIR"
chmod 700 "$CONFIG_DIR" 2>/dev/null || true

ARCH="$(uname -m)"
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "$ARCH" in
  x86_64|amd64) ARCH_TAG="x86_64" ;;
  aarch64|arm64) ARCH_TAG="aarch64" ;;
  *) ARCH_TAG="$ARCH" ;;
esac

resolve_bin() {
  if command -v lab-agent >/dev/null 2>&1; then
    command -v lab-agent
    return
  fi
  if [[ -x "${PREFIX}/bin/lab-agent" ]]; then
    echo "${PREFIX}/bin/lab-agent"
    return
  fi
  if [[ -n "$BIN_URL" ]]; then
    echo "Downloading lab-agent from --bin-url ..." >&2
    curl -fsSL "$BIN_URL" -o "${PREFIX}/bin/lab-agent"
    chmod 755 "${PREFIX}/bin/lab-agent"
    echo "${PREFIX}/bin/lab-agent"
    return
  fi
  # optional: cargo build if source present
  if command -v cargo >/dev/null 2>&1 && [[ -f "${HOME}/local-ai-bridge/Cargo.toml" ]]; then
    echo "Building lab-agent from ~/local-ai-bridge ..." >&2
    (cd "${HOME}/local-ai-bridge" && cargo build --release -p lab-agent)
    install -m 755 "${HOME}/local-ai-bridge/target/release/lab-agent" "${PREFIX}/bin/lab-agent"
    echo "${PREFIX}/bin/lab-agent"
    return
  fi
  return 1
}

if ! BIN="$(resolve_bin)"; then
  cat >&2 <<EOF
ERROR: lab-agent binary not found.

Provide one of:
  1) lab-agent already in PATH
  2) --bin-url https://.../lab-agent  (linux ${ARCH_TAG})
  3) clone+build: cargo build --release -p lab-agent  then re-run
  4) export LAB_AGENT_BIN_URL=...

Manager tutorial: ${BASE_URL}/tutorial
EOF
  exit 1
fi

umask 077
cat >"${CONFIG_DIR}/agent.env" <<EOF
# generated by local-ai-bridge-manager server installer
LAB_AGENT_TOKEN=${TOKEN}
LAB_AGENT_NAME=${NAME}
LAB_AGENT_LOCAL=${LOCAL_AI}
LAB_AGENT_RELAY=${RELAY}
LAB_AGENT_BIN=${BIN}
LAB_MANAGER_URL=${BASE_URL}
EOF
chmod 600 "${CONFIG_DIR}/agent.env"

# thin launcher
cat >"${PREFIX}/bin/lab-agent-run" <<EOF
#!/usr/bin/env bash
set -euo pipefail
# shellcheck disable=SC1091
source "${CONFIG_DIR}/agent.env"
exec "\${LAB_AGENT_BIN}" \\
  --relay "\${LAB_AGENT_RELAY}" \\
  --local "\${LAB_AGENT_LOCAL}" \\
  --tunnel-name "\${LAB_AGENT_NAME}"
EOF
chmod 755 "${PREFIX}/bin/lab-agent-run"

# systemd user unit (best-effort)
if command -v systemctl >/dev/null 2>&1; then
  cat >"${UNIT_DIR}/lab-agent.service" <<EOF
[Unit]
Description=local-ai-bridge lab-agent (${NAME})
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
EnvironmentFile=${CONFIG_DIR}/agent.env
ExecStart=${BIN} --relay \${LAB_AGENT_RELAY} --local \${LAB_AGENT_LOCAL} --tunnel-name \${LAB_AGENT_NAME}
Restart=always
RestartSec=3

[Install]
WantedBy=default.target
EOF
  systemctl --user daemon-reload 2>/dev/null || true
  if systemctl --user enable --now lab-agent.service 2>/dev/null; then
    sleep 1
    systemctl --user --no-pager --full status lab-agent.service | head -20 || true
    echo "systemd user unit: lab-agent.service (enabled)"
  else
    echo "systemd user enable failed (linger off?). Start manually:"
    echo "  ${PREFIX}/bin/lab-agent-run"
  fi
else
  echo "No systemctl — start manually:"
  echo "  ${PREFIX}/bin/lab-agent-run"
fi

echo
echo "Installed server/agent:"
echo "  bin      $BIN"
echo "  env      ${CONFIG_DIR}/agent.env"
echo "  run      ${PREFIX}/bin/lab-agent-run"
echo "  relay    $RELAY"
echo "  local AI $LOCAL_AI"
echo "  name     $NAME"
echo
echo "Mark server online in manager Admin if needed: ${BASE_URL}/admin"
echo "Done."
