#!/usr/bin/env bash
set -euo pipefail

# Offline install from local enroll archive.
# The script expects either:
# 1) `service.sh` + `updater-*.{exe,bin}` already unpacked next to it, or
# 2) a single `.zip` archive next to it, or passed via `--zip`.
#
# Typical MDM flow:
# 1. Admin downloads the Linux enroll archive from Ringo once.
# 2. MDM copies the archive and this script to each target machine.
# 3. The script unpacks the archive locally and runs non-interactive install.

usage() {
  cat <<EOF
Usage:
  sudo bash $0 [--zip /path/to/ringo-linux.zip]

The script looks for:
  - service.sh in the same folder, or
  - the first *.zip file in the same folder
EOF
}

if [ "$(id -u)" -ne 0 ]; then
  exec sudo -E "$0" "$@"
fi

ZIP_PATH=""
while [ $# -gt 0 ]; do
  case "$1" in
    --zip)
      ZIP_PATH="${2:?--zip needs a value}"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "unknown arg: $1" >&2
      usage >&2
      exit 1
      ;;
  esac
done

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

if systemctl is-active ringo-agent >/dev/null 2>&1; then
  echo "ringo-agent already running"
  exit 0
fi

WORKDIR="$SCRIPT_DIR"
CLEANUP_WORKDIR=""
SERVICE_SH="$WORKDIR/service.sh"

if [ ! -f "$SERVICE_SH" ]; then
  if [ -z "$ZIP_PATH" ]; then
    ZIP_PATH="$(find "$SCRIPT_DIR" -maxdepth 1 -type f -name '*.zip' | sed -n '1p')"
  fi

  [ -n "$ZIP_PATH" ] || {
    echo "service.sh or *.zip not found next to script: $SCRIPT_DIR" >&2
    exit 1
  }
  [ -f "$ZIP_PATH" ] || {
    echo "zip not found: $ZIP_PATH" >&2
    exit 1
  }

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

  unzip -q "$ZIP_PATH" -d "$WORKDIR"
  SERVICE_SH="$WORKDIR/service.sh"
fi

[ -f "$SERVICE_SH" ] || {
  echo "service.sh not found after unpack: $SERVICE_SH" >&2
  exit 1
}

# service.sh contains: updater install --url <SERVER_URL> --challenge <CHALLENGE>
PARSED="$(sed -nE 's/.*--url[[:space:]]+([^[:space:]]+)[[:space:]]+--challenge[[:space:]]+([^[:space:]]+).*/\1 \2/p' "$SERVICE_SH" | sed -n '1p' | tr -d '"')"
[ -n "$PARSED" ] || {
  echo "failed to parse --url/--challenge from service.sh" >&2
  exit 1
}
SERVER_URL="${PARSED%% *}"
CHALLENGE="${PARSED##* }"

case "$(uname -m)" in
  x86_64) UPDATER="$WORKDIR/updater-amd64" ;;
  aarch64|arm64) UPDATER="$WORKDIR/updater-arm64" ;;
  *)
    echo "unsupported arch: $(uname -m)" >&2
    exit 1
    ;;
esac

[ -f "$UPDATER" ] || {
  echo "updater not found: $UPDATER" >&2
  exit 1
}

chmod +x "$UPDATER"
"$UPDATER" install --url "$SERVER_URL" --challenge "$CHALLENGE"
