#!/bin/sh
set -eu

BASE_URL='https://sendthings.app'
VERSION='89745e0'
DEFAULT_SIGNALING_URL='wss://sendthings-signaling.contact-70f.workers.dev/ws'

OS=$(uname -s)
ARCH=$(uname -m)
case "$OS/$ARCH" in
  Linux/x86_64) TARGET=linux-amd64 ;;
  Linux/aarch64|Linux/arm64) TARGET=linux-arm64 ;;
  Darwin/x86_64) TARGET=darwin-amd64 ;;
  Darwin/arm64) TARGET=darwin-arm64 ;;
  *) echo "Unsupported platform: $OS/$ARCH. Windows binaries: $BASE_URL/terminal/bin/$VERSION/windows-amd64/" >&2; exit 1 ;;
esac

download() {
  if command -v curl >/dev/null 2>&1; then curl -fsSL "$1" -o "$2"
  elif command -v wget >/dev/null 2>&1; then wget -qO "$2" "$1"
  else echo "curl or wget is required" >&2; return 1
  fi
}
checksum() {
  if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}'
  elif command -v shasum >/dev/null 2>&1; then shasum -a 256 "$1" | awk '{print $1}'
  else echo "sha256sum or shasum is required" >&2; return 1
  fi
}

CACHE_ROOT="${XDG_CACHE_HOME:-$HOME/.cache}/sendthings"
mkdir -p "$CACHE_ROOT"
TMP_DIR=$(mktemp -d "$CACHE_ROOT/.download.XXXXXX")
trap 'rm -rf "$TMP_DIR"' EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
# latest is a mutable alias, never a cache key. Resolve it to an immutable build.
if [ "$VERSION" = latest ]; then
  download "$BASE_URL/terminal/bin/latest/manifest.json" "$TMP_DIR/manifest.json"
  VERSION=$(sed -n 's/.*"version":[[:space:]]*"\([^"]*\)".*/\1/p' "$TMP_DIR/manifest.json")
fi
case "$VERSION" in
  ''|latest|.*|*[!a-zA-Z0-9._-]*) echo "Invalid terminal version" >&2; exit 1 ;;
esac
CACHE_DIR="$CACHE_ROOT/$VERSION/$TARGET"
BIN_PATH="$CACHE_DIR/sendthings-terminal"
SHA_PATH="$CACHE_DIR/sendthings-terminal.sha256"
VALID=0
if [ -x "$BIN_PATH" ] && [ -s "$SHA_PATH" ]; then
  EXPECTED=$(awk '{print $1}' "$SHA_PATH")
  ACTUAL=$(checksum "$BIN_PATH")
  if [ -n "$EXPECTED" ] && [ "$EXPECTED" = "$ACTUAL" ]; then VALID=1; fi
fi
if [ "$VALID" -eq 0 ]; then
  download "$BASE_URL/terminal/bin/$VERSION/$TARGET/sendthings-terminal" "$TMP_DIR/binary"
  download "$BASE_URL/terminal/bin/$VERSION/$TARGET/sendthings-terminal.sha256" "$TMP_DIR/checksum"
  EXPECTED=$(awk '{print $1}' "$TMP_DIR/checksum")
  ACTUAL=$(checksum "$TMP_DIR/binary")
  if [ -z "$EXPECTED" ] || [ "$EXPECTED" != "$ACTUAL" ]; then
    echo "Checksum mismatch for downloaded terminal binary" >&2; exit 1
  fi
  chmod +x "$TMP_DIR/binary"
  mkdir -p "$CACHE_DIR"
  mv "$TMP_DIR/binary" "$BIN_PATH"
  mv "$TMP_DIR/checksum" "$SHA_PATH"
fi

HAS_SIGNALING=0
HAS_WEB_ORIGIN=0
for ARG in "$@"; do
  case "$ARG" in --signaling-url|--signaling-url=*) HAS_SIGNALING=1 ;; esac
  case "$ARG" in --web-origin|--web-origin=*) HAS_WEB_ORIGIN=1 ;; esac
done
if [ "$HAS_SIGNALING" -eq 0 ] && [ -z "${SENDTHINGS_SIGNALING_URL:-}" ] && [ -n "$DEFAULT_SIGNALING_URL" ]; then
  set -- --signaling-url "$DEFAULT_SIGNALING_URL" "$@"
  if [ "$HAS_WEB_ORIGIN" -eq 0 ] && [ -z "${SENDTHINGS_WEB_ORIGIN:-}" ]; then
    set -- --web-origin "$BASE_URL" "$@"
  fi
fi
rm -rf "$TMP_DIR"
trap - EXIT INT TERM
# curl | sh consumes stdin as script; reopen the terminal for interactive use.
if [ -t 0 ]; then exec "$BIN_PATH" "$@"
elif ( : </dev/tty ) 2>/dev/null; then exec "$BIN_PATH" "$@" </dev/tty
else exec "$BIN_PATH" "$@" </dev/null
fi
