#!/bin/sh
set -eu
LOG=/var/log/team-devspace-install.log
EXPECTED_ARCH='__TEAM_DEVSPACE_MACOS_ARCH__'
MINIMUM_MACOS_VERSION='__TEAM_DEVSPACE_MACOS_MINIMUM_VERSION__'
: > "$LOG" 2>/dev/null || true
/bin/chmod 644 "$LOG" 2>/dev/null || true
log() { /usr/bin/printf '%s [preinstall] %s\n' "$(/bin/date -u '+%Y-%m-%dT%H:%M:%SZ')" "$*" >> "$LOG" 2>/dev/null || true; }
trap 'code=$?; if [ "$code" -ne 0 ]; then log "FAILED exit=$code"; fi' EXIT
log 'start'
# Installer may run as root; the DevSpace runtime must not.
if [ "${3:-/}" != "/" ]; then log 'skip non-root target'; exit 0; fi
KERNEL_ARCH=$(/usr/bin/uname -m 2>/dev/null || true)
ARCH=$KERNEL_ARCH
if [ "$(/usr/sbin/sysctl -n hw.optional.arm64 2>/dev/null || true)" = 1 ]; then ARCH=arm64; fi
if [ "$ARCH" = x86_64 ]; then ARCH=x64; fi
# An Intel payload is supported on Apple Silicon only when Rosetta already works.
# Never install Rosetta or weaken the reverse (ARM-on-Intel) architecture guard.
if [ "$ARCH" = arm64 ] && [ "$EXPECTED_ARCH" = x64 ] &&
   /usr/bin/arch -x86_64 /usr/bin/true >/dev/null 2>&1; then
  log 'Intel package will run under the existing Rosetta installation'
  ARCH=x64
fi
if [ "$ARCH" != "$EXPECTED_ARCH" ]; then
  log "ERROR code=UNSUPPORTED_ARCH actual=$ARCH kernel=$KERNEL_ARCH required=$EXPECTED_ARCH"
  echo "This Team DevSpace package requires macOS $EXPECTED_ARCH. This Mac reports $ARCH. See $LOG." >&2
  exit 1
fi
MACOS_VERSION=$(/usr/bin/sw_vers -productVersion 2>/dev/null || true)
if ! /usr/bin/awk -v actual="$MACOS_VERSION" -v minimum="$MINIMUM_MACOS_VERSION" '
  function value(v, a, n, i) {
    n=split(v,a,"."); if (n < 2 || n > 3) return -1;
    for (i=1; i<=n; i++) if (a[i] !~ /^[0-9]+$/) return -1;
    return (a[1]+0)*1000000 + (a[2]+0)*1000 + (n > 2 ? a[3]+0 : 0);
  }
  BEGIN { a=value(actual); m=value(minimum); exit ! (a >= m && m >= 0) }
'; then
  log "ERROR code=UNSUPPORTED_MACOS actual=$MACOS_VERSION required=$MINIMUM_MACOS_VERSION"
  echo "Team DevSpace requires macOS $MINIMUM_MACOS_VERSION or newer. This Mac reports $MACOS_VERSION. See $LOG." >&2
  exit 1
fi
if [ -e /usr/local/bin/team-devspace ] && ! /usr/bin/grep -q 'Team DevSpace managed CLI entrypoint' /usr/local/bin/team-devspace; then
  log 'ERROR code=CLI_CONFLICT path=/usr/local/bin/team-devspace'
  echo 'An unrelated /usr/local/bin/team-devspace exists. It will not be overwritten. See /var/log/team-devspace-install.log.' >&2
  exit 1
fi
USER_NAME=$(/usr/bin/stat -f %Su /dev/console)
if [ "$USER_NAME" = root ] || [ "$USER_NAME" = loginwindow ]; then exit 0; fi
USER_HOME=$(/usr/bin/dscl . -read "/Users/$USER_NAME" NFSHomeDirectory | /usr/bin/sed 's/^NFSHomeDirectory: //')
ROOT="$USER_HOME/Library/Application Support/TeamDevSpace/distribution"
ACTIVE="$ROOT/active-path"
LEGACY_APP="/Applications/Team DevSpace.app/Contents/Resources/app"
if [ ! -f "$ACTIVE" ] && [ -x "$LEGACY_APP/runtime/bin/node" ]; then
  # Preserve a recoverable copy before the lightweight App wrapper replaces the
  # original monolithic bundle. Do not stop the active user session in preinstall:
  # the post-install transaction performs that switch only after PKG succeeds.
  APP="$ROOT/versions/legacy"
  /bin/mkdir -p "$ROOT/versions"
  /bin/rm -rf "$APP"
  /usr/bin/ditto "$LEGACY_APP" "$APP"
  /usr/sbin/chown -R "$USER_NAME" "$ROOT"
  /usr/bin/printf '%s\n' "$APP" > "$ACTIVE"
  /usr/sbin/chown "$USER_NAME" "$ACTIVE"
fi
log 'complete'
