#!/usr/bin/env bash
# Install a NIZZY Mac package to a stable path and open the Cursor MCP deeplink.
#
# Channels (side-by-side):
#   stable  $HOME/.nizzy/bin/nizzy        MCP name nizzy      port 3000
#   dev     $HOME/.nizzy-dev/bin/nizzy-dev  MCP name nizzy-dev  port 3100
#
# Usage:
#   curl -fsSL https://<cdn-or-site>/install-macos.sh | bash
#   NIZZY_CHANNEL=dev NIZZY_TARBALL=./dist/nizzy-dev-macos-arm64.tar.gz ./packaging/install-macos.sh
#   NIZZY_DOWNLOAD_BASE_URL=https://cdn.example.com/nizzy ./packaging/install-macos.sh
#
# Env:
#   NIZZY_CHANNEL            — stable (default) | dev
#   NIZZY_DOWNLOAD_BASE_URL  — base hosting tar.gz (no trailing slash)
#   NIZZY_TARBALL            — local .tar.gz (skips download)
#   NIZZY_CONTROL_PLANE_URL  — license control plane (optional)
#   NIZZY_SKIP_DEEPLINK=1    — install only; do not open Cursor
#   NIZZY_ARCH               — arm64 | x64 (default: host)
#   NIZZY_INSTALL_ROOT       — override install root
# Legacy COMPOSER_* names still work for one release.
set -euo pipefail

env_nizzy() {
  local suffix="$1"
  local n="NIZZY_${suffix}"
  local c="COMPOSER_${suffix}"
  if [[ -n "${!n:-}" ]]; then
    printf '%s' "${!n}"
  else
    printf '%s' "${!c:-}"
  fi
}

CHANNEL_RAW="$(env_nizzy CHANNEL)"
CHANNEL_RAW="$(printf '%s' "${CHANNEL_RAW:-stable}" | tr '[:upper:]' '[:lower:]')"
case "$CHANNEL_RAW" in
  dev) CHANNEL=dev; MCP_NAME=nizzy-dev; BIN_NAME=nizzy-dev; PKG_PREFIX=nizzy-dev; DEFAULT_PORT=3100; DEFAULT_REPORT_PORT=4322; DEFAULT_ROOT_NAME=.nizzy-dev ;;
  lab)
    echo "nizzy-install: NIZZY Lab is not available yet. Use stable or dev." >&2
    exit 1
    ;;
  stable|"") CHANNEL=stable; MCP_NAME=nizzy; BIN_NAME=nizzy; PKG_PREFIX=nizzy; DEFAULT_PORT=3000; DEFAULT_REPORT_PORT=4321; DEFAULT_ROOT_NAME=.nizzy ;;
  *)
    echo "nizzy-install: unknown NIZZY_CHANNEL=${CHANNEL_RAW} (use stable or dev)" >&2
    exit 1
    ;;
esac

INSTALL_ROOT="$(env_nizzy INSTALL_ROOT)"
INSTALL_ROOT="${INSTALL_ROOT:-$HOME/${DEFAULT_ROOT_NAME}}"
RUNTIME_DIR="$INSTALL_ROOT/runtime"
BIN_DIR="$INSTALL_ROOT/bin"
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/nizzy-install.XXXXXX")"
trap 'rm -rf "$TMP_DIR"' EXIT

host_arch="$(uname -m)"
ARCH_IN="$(env_nizzy ARCH)"
case "${ARCH_IN:-$host_arch}" in
  arm64|aarch64) ARCH=arm64 ;;
  x86_64|x64|amd64) ARCH=x64 ;;
  *)
    echo "nizzy-install: unsupported arch: ${ARCH_IN:-$host_arch}" >&2
    exit 1
    ;;
esac

PKG_NAME="${PKG_PREFIX}-macos-${ARCH}"
TARBALL_NAME="${PKG_NAME}.tar.gz"

echo "nizzy-install: channel=${CHANNEL}"
echo "nizzy-install: arch=${ARCH}"
echo "nizzy-install: target=${INSTALL_ROOT}"

mkdir -p "$RUNTIME_DIR" "$BIN_DIR"

TARBALL="$(env_nizzy TARBALL)"
DOWNLOAD_BASE="$(env_nizzy DOWNLOAD_BASE_URL)"
if [[ -n "$TARBALL" ]]; then
  if [[ ! -f "$TARBALL" ]]; then
    echo "nizzy-install: NIZZY_TARBALL not found: $TARBALL" >&2
    exit 1
  fi
  cp "$TARBALL" "$TMP_DIR/$TARBALL_NAME"
elif [[ -n "$DOWNLOAD_BASE" ]]; then
  BASE="${DOWNLOAD_BASE%/}"
  URL="${BASE}/${TARBALL_NAME}"
  echo "nizzy-install: downloading ${URL}"
  curl -fsSL "$URL" -o "$TMP_DIR/$TARBALL_NAME"
else
  echo "nizzy-install: set NIZZY_TARBALL or NIZZY_DOWNLOAD_BASE_URL" >&2
  exit 1
fi

echo "nizzy-install: extracting"
rm -rf "${RUNTIME_DIR:?}/${PKG_NAME}"
tar -xzf "$TMP_DIR/$TARBALL_NAME" -C "$RUNTIME_DIR"

LAUNCHER="${RUNTIME_DIR}/${PKG_NAME}/${BIN_NAME}"
if [[ ! -x "$LAUNCHER" ]]; then
  echo "nizzy-install: launcher missing or not executable at $LAUNCHER" >&2
  exit 1
fi

ln -sfn "$LAUNCHER" "$BIN_DIR/$BIN_NAME"
chmod +x "$LAUNCHER" "$BIN_DIR/$BIN_NAME"

ABS_CMD="$(cd "$(dirname "$BIN_DIR/$BIN_NAME")" && pwd)/$BIN_NAME"
# Resolve symlink for MCP (Cursor wants a real executable path)
ABS_CMD="$(python3 -c 'import os,sys; print(os.path.realpath(sys.argv[1]))' "$ABS_CMD")"

echo "nizzy-install: installed"
echo "  MCP command: ${ABS_CMD}"
"$ABS_CMD" --version 2>/dev/null || true

CONTROL_PLANE="$(env_nizzy CONTROL_PLANE_URL)"
build_deeplink() {
  local cmd="$1"
  python3 - "$cmd" "$CONTROL_PLANE" "$MCP_NAME" "$CHANNEL" "$DEFAULT_PORT" "$DEFAULT_REPORT_PORT" <<'PY'
import base64, json, sys, urllib.parse
cmd, cp, name, channel, port, report_port = sys.argv[1:7]
env = {
    "NIZZY_CHANNEL": channel,
    "NIZZY_PORT": port,
    "NIZZY_REPORT_PORT": report_port,
    "NIZZY_REPORT_SERVER_ENABLED": "true",
    "NIZZY_LICENSE_ENFORCEMENT": "true",
}
if cp:
    env["NIZZY_CONTROL_PLANE_URL"] = cp
config = {"command": cmd, "args": [], "env": env}
b64 = base64.b64encode(json.dumps(config, separators=(",", ":")).encode()).decode()
print(
    "cursor://anysphere.cursor-deeplink/mcp/install"
    f"?name={urllib.parse.quote(name)}"
    f"&config={urllib.parse.quote(b64)}"
)
PY
}

DEEPLINK="$(build_deeplink "$ABS_CMD")"
echo "nizzy-install: Cursor deeplink ready (${MCP_NAME})"

SKIP="$(env_nizzy SKIP_DEEPLINK)"
if [[ "$SKIP" == "1" ]]; then
  echo "nizzy-install: skip deeplink (NIZZY_SKIP_DEEPLINK=1)"
  echo "$DEEPLINK"
  exit 0
fi

if command -v open >/dev/null 2>&1; then
  echo "nizzy-install: opening Cursor…"
  open "$DEEPLINK" || {
    echo "nizzy-install: could not open deeplink; paste this in a browser:" >&2
    echo "$DEEPLINK" >&2
  }
else
  echo "$DEEPLINK"
fi

echo "nizzy-install: done — pair the device at your product /device page"
echo "nizzy-install: installing another channel does not replace this one"
