#!/usr/bin/env bash
# uxrun.sh - run any command, then get a UserAlertX alert when it finishes.
#
#   ./uxrun.sh make build
#   ./uxrun.sh ./backup.sh --full
#   ./uxrun.sh -m sms rsync -a /data /backup     # force text (-m email)
#
# Alert: "Done: make build (took 3m12s)" or
#        "FAILED (exit 2): make build after 41s - <last lines of output>"
# The command's own output still shows on screen as it runs.
#
# API key: USERALERTX_API_KEY env var, else ~/.useralertx_key (create it
# once with uxsend.sh). USERALERTX_DRYRUN=1 prints instead of sending.

URL="${USERALERTX_URL:-https://useralertx.com/cgi-bin/itmessages.cgi}"
METHOD=""
if [ "$1" = "-m" ]; then METHOD="$2"; shift 2; fi
[ $# -eq 0 ] && { echo "usage: uxrun.sh [-m sms|email] command [args...]"; exit 2; }

send() {
  if [ -n "${USERALERTX_DRYRUN:-}" ]; then echo "[dry run] would send: $1"; return 0; fi
  local key="${USERALERTX_API_KEY:-}"
  [ -z "$key" ] && [ -f "$HOME/.useralertx_key" ] && key="$(tr -d '[:space:]' < "$HOME/.useralertx_key")"
  [ -z "$key" ] && { echo "uxrun: no API key (set USERALERTX_API_KEY or run uxsend.sh once to save it)"; return 1; }
  local args=(-s -o /dev/null -w '%{http_code}' -A 'UserAlertX-example-uxrun/1.0' -H "X-Api-Key: $key" --data-urlencode "body=$1")
  [ -n "$METHOD" ] && args+=(--data-urlencode "method=$METHOD")
  local code; code="$(curl "${args[@]}" "$URL")"
  case "$code" in 200|202) echo "uxrun: alert sent";; *) echo "uxrun: alert NOT sent (HTTP $code)";; esac
}

human() { local s=$1; if [ "$s" -ge 3600 ]; then printf '%dh%02dm' $((s/3600)) $((s%3600/60));
          elif [ "$s" -ge 60 ]; then printf '%dm%02ds' $((s/60)) $((s%60)); else printf '%ds' "$s"; fi; }

LOG="$(mktemp)"; trap 'rm -f "$LOG"' EXIT
START=$(date +%s)
"$@" 2>&1 | tee "$LOG"
RC=${PIPESTATUS[0]}
TOOK="$(human $(( $(date +%s) - START )))"
CMD="$*"; [ ${#CMD} -gt 60 ] && CMD="${CMD:0:57}..."
if [ "$RC" -eq 0 ]; then
  send "Done: $CMD (took $TOOK)"
else
  TAIL="$(tail -n 3 "$LOG" | tr '\n' ' ' | cut -c1-200)"
  send "FAILED (exit $RC): $CMD after $TOOK${TAIL:+ - $TAIL}"
fi
exit "$RC"
