#!/usr/bin/env bash
# VampCode remote installer (macOS / Linux)
# Usage:
#   curl -fsSL https://vampcode.vampelium.workers.dev/install.sh | bash
#
# Env:
#   VAMPCODE_BASE=https://...   override CDN
#   VAMPCODE_SKIP_IDE=1         skip IDE install
#
# VAMPCODE_INSTALL_BASE=https://vampcode.vampelium.workers.dev

set -euo pipefail

info() { printf '==> %s\n' "$*"; }
ok()   { printf '  %s\n' "$*"; }
warn() { printf '  ! %s\n' "$*" >&2; }
die()  { printf 'error: %s\n' "$*" >&2; exit 1; }

# Prefer env, then embedded install base from this script, then default
if [ -n "${VAMPCODE_BASE:-}" ]; then
  BASE="$VAMPCODE_BASE"
else
  EMBEDDED="$(grep -E '^# VAMPCODE_INSTALL_BASE=' "$0" 2>/dev/null | head -1 | sed 's/^# VAMPCODE_INSTALL_BASE=//')" || true
  # When piped to bash, $0 is bash — fall back to default (publish rewrites default)
  if [ -n "${EMBEDDED:-}" ] && [[ "$EMBEDDED" == http* ]]; then
    BASE="$EMBEDDED"
  else
    BASE="https://vampcode.vampelium.workers.dev"
  fi
fi
BASE="${BASE%/}"

echo ""
echo "  VampCode installer"
echo "  source: $BASE"
echo ""

info "Fetching release metadata"
MANIFEST="$(curl -fsSL "$BASE/latest.json")" || die "failed to fetch $BASE/latest.json"
VERSION="$(printf '%s' "$MANIFEST" | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)"
[ -n "$VERSION" ] || die "latest.json missing version"
ok "version $VERSION"

INSTALL_ROOT="${HOME}/.vampcode"
BIN_DIR="${INSTALL_ROOT}/bin"
SHARE_DIR="${INSTALL_ROOT}/share"
mkdir -p "$BIN_DIR" "$SHARE_DIR"

# Prefer ~/.cargo/bin when present
if [ -d "${HOME}/.cargo/bin" ]; then
  TARGET_BIN="${HOME}/.cargo/bin"
else
  TARGET_BIN="$BIN_DIR"
fi
mkdir -p "$TARGET_BIN"

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

PLATFORM=""
case "$OS" in
  linux)  PLATFORM="linux-${ARCH}" ;;
  darwin) PLATFORM="darwin-${ARCH}" ;;
  *)      PLATFORM="${OS}-${ARCH}" ;;
esac

asset_path() {
  # Try to extract from JSON: assets.<platform>.vampcode
  printf '%s' "$MANIFEST" | tr -d '\n' | sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*{[^}]*\"vampcode\"[[:space:]]*:[[:space:]]*\"\\([^\"]*\\)\".*/\\1/p" | head -1
}

download() {
  local url="$1" out="$2"
  if [[ "$url" != http* ]]; then
    url="${BASE}${url}"
  fi
  curl -fsSL "$url" -o "$out"
}

info "Installing CLI for $PLATFORM"
REL="$(asset_path "$PLATFORM" || true)"
TMP="$(mktemp -d)"
cleanup() { rm -rf "$TMP"; }
trap cleanup EXIT

INSTALLED=0
if [ -n "${REL:-}" ]; then
  ok "GET $REL"
  if download "$REL" "$TMP/vampcode"; then
    chmod +x "$TMP/vampcode"
    cp "$TMP/vampcode" "$TARGET_BIN/vampcode"
    cp "$TMP/vampcode" "$TARGET_BIN/vamp"
    INSTALLED=1
    ok "installed $TARGET_BIN/vampcode"
  fi
fi

# Fallback path layout /releases/<ver>/<platform>/vampcode
if [ "$INSTALLED" -eq 0 ]; then
  CANDIDATES=(
    "/releases/${VERSION}/${PLATFORM}/vampcode"
    "/releases/${VERSION}/${PLATFORM}/vampcode.bin"
  )
  for c in "${CANDIDATES[@]}"; do
    if download "$c" "$TMP/vampcode" 2>/dev/null; then
      chmod +x "$TMP/vampcode"
      # basic sanity: not an HTML error page
      if head -c 2 "$TMP/vampcode" | grep -q 'MZ\|ELF\|\xcf\xfa' 2>/dev/null || [ "$(wc -c < "$TMP/vampcode")" -gt 10000 ]; then
        cp "$TMP/vampcode" "$TARGET_BIN/vampcode"
        cp "$TMP/vampcode" "$TARGET_BIN/vamp"
        INSTALLED=1
        ok "installed $TARGET_BIN/vampcode"
        break
      fi
    fi
  done
fi

# Source / cargo fallback
if [ "$INSTALLED" -eq 0 ]; then
  warn "No prebuilt binary for $PLATFORM"
  if command -v cargo >/dev/null 2>&1; then
    REPO_URL="$(printf '%s' "$MANIFEST" | sed -n 's/.*"repository"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)"
    if [ -n "$REPO_URL" ]; then
      info "Building from source via cargo install --git"
      cargo install --git "$REPO_URL" vamp-cli --force || cargo install --git "$REPO_URL" --force || true
      if command -v vampcode >/dev/null 2>&1; then
        INSTALLED=1
      fi
    fi
  fi
fi

if [ "$INSTALLED" -eq 0 ]; then
  die "Could not install vampcode for $PLATFORM. Install Rust (https://rustup.rs) and rebuild, or use Windows prebuilt."
fi

# PATH hint
info "PATH"
case ":$PATH:" in
  *":$TARGET_BIN:"*) ok "PATH already includes $TARGET_BIN" ;;
  *)
    ok "Add to your shell profile:"
    echo "    export PATH=\"$TARGET_BIN:\$PATH\""
    # best-effort append for bash/zsh
    for rc in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.profile"; do
      if [ -f "$rc" ] || [ "$rc" = "$HOME/.profile" ]; then
        if ! grep -q '\.vampcode/bin\|\.cargo/bin' "$rc" 2>/dev/null; then
          echo "" >> "$rc"
          echo "# VampCode" >> "$rc"
          echo "export PATH=\"$TARGET_BIN:\$PATH\"" >> "$rc"
          ok "updated $rc"
          break
        fi
      fi
    done
    export PATH="$TARGET_BIN:$PATH"
    ;;
esac

# IDE
if [ "${VAMPCODE_SKIP_IDE:-0}" != "1" ]; then
  info "Installing IDE language support"
  VSIX_URL="$(printf '%s' "$MANIFEST" | tr -d '\n' | sed -n 's/.*"vsix"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)"
  EXT_ZIP="$(printf '%s' "$MANIFEST" | tr -d '\n' | sed -n 's/.*"extension_zip"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)"
  VSIX_PATH="${SHARE_DIR}/vampcode-${VERSION}.vsix"
  if [ -n "$VSIX_URL" ]; then
    if download "$VSIX_URL" "$VSIX_PATH" 2>/dev/null; then
      ok "VSIX $VSIX_PATH"
      for cmd in code-insiders code cursor codium windsurf; do
        if command -v "$cmd" >/dev/null 2>&1; then
          if "$cmd" --install-extension "$VSIX_PATH" --force >/dev/null 2>&1; then
            ok "$cmd: extension installed"
          fi
        fi
      done
    fi
  fi
  if [ -n "$EXT_ZIP" ]; then
    Z="$TMP/ext.zip"
    if download "$EXT_ZIP" "$Z" 2>/dev/null; then
      EXT_DIR="${SHARE_DIR}/vscode-extension"
      rm -rf "$EXT_DIR"
      mkdir -p "$EXT_DIR"
      unzip -q "$Z" -d "$EXT_DIR" 2>/dev/null || python3 - <<PY
import zipfile
zipfile.ZipFile(r"$Z").extractall(r"$EXT_DIR")
PY
      FOLDER="vampcode.vampcode-${VERSION}"
      if [ -f "$EXT_DIR/package.json" ]; then
        PUB=$(sed -n 's/.*"publisher"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$EXT_DIR/package.json" | head -1)
        NAME=$(sed -n 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$EXT_DIR/package.json" | head -1)
        VER=$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$EXT_DIR/package.json" | head -1)
        FOLDER="${PUB}.${NAME}-${VER}"
      fi
      for root in \
        "$HOME/.vscode/extensions" \
        "$HOME/.vscode-insiders/extensions" \
        "$HOME/.cursor/extensions" \
        "$HOME/.vscode-oss/extensions" \
        "$HOME/.windsurf/extensions"
      do
        mkdir -p "$root"
        dest="$root/$FOLDER"
        rm -rf "$dest"
        mkdir -p "$dest"
        cp -a "$EXT_DIR"/. "$dest"/
        ok "+ $dest"
      done
    fi
  fi
fi

printf '{"version":"%s","installed_at":"%s","base":"%s","bin":"%s"}\n' \
  "$VERSION" "$(date -Iseconds 2>/dev/null || date)" "$BASE" "$TARGET_BIN/vampcode" \
  > "${INSTALL_ROOT}/install.json"

echo ""
echo "VampCode $VERSION installed."
echo ""
echo "Try:"
echo "  vampcode --version"
echo "  vampcode create my-app"
echo "  cd my-app && vampcode run ."
echo ""
echo "IDE: reload VS Code / Cursor, open any .vamp file"
echo ""

"$TARGET_BIN/vampcode" --version || true
