#!/bin/bash
set -euo pipefail

log() {
  printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S %Z')" "$1"
}

extract_pid() {
  local text="$1"
  local pid
  pid=$(grep -Eo 'Runtime: [^(]+\(pid [0-9]+' <<<"$text" | sed -E 's/.*\(pid ([0-9]+).*/\1/' || true)
  [[ -n "$pid" ]] && printf '%s' "$pid" || printf 'unknown'
}

extract_runtime() {
  local text="$1"
  local runtime
  runtime=$(grep -Eo 'Runtime: [^\(]+' <<<"$text" | sed -E 's/Runtime: //;s/[[:space:]]+$//')
  [[ -n "$runtime" ]] && printf '%s' "$runtime" || printf 'unknown'
}

extract_rpc() {
  local text="$1"
  local rpc
  rpc=$(grep -Eo 'RPC probe: [^\n]+' <<<"$text" | sed -E 's/RPC probe: //')
  [[ -n "$rpc" ]] && printf '%s' "$rpc" || printf 'unknown'
}

LAUNCH_AGENT=ai.openclaw.gateway
PLIST="$HOME/Library/LaunchAgents/${LAUNCH_AGENT}.plist"
LABEL="gui/$UID/${LAUNCH_AGENT}"
STATUS_OK=0

validate_plist() {
  log "Validating LaunchAgent plist..."
  if ! plutil -lint "$PLIST"; then
    log "ERROR: plutil validation failed"
    exit 1
  fi
  if /usr/libexec/PlistBuddy -c "Print :Comment" "$PLIST" >/dev/null 2>&1; then
    log "ERROR: disallowed key 'Comment' detected in plist"
    exit 1
  fi
  log "Plist validation passed"
}

log "Capturing current gateway status..."
PRE_STATUS=$(openclaw gateway status 2>/dev/null || true)
PRE_PID=$(extract_pid "$PRE_STATUS")

validate_plist

if launchctl print "$LABEL" >/dev/null 2>&1; then
  log "Restarting ${LAUNCH_AGENT} via launchctl kickstart -k ..."
  launchctl kickstart -k "$LABEL"
else
  log "${LAUNCH_AGENT} is not currently loaded; attempting launchctl bootstrap..."
  launchctl bootstrap "gui/$UID" "${PLIST}"
fi

log "Polling openclaw gateway status for health..."
POST_STATUS=$(openclaw gateway status)
printf '%s\n' "$POST_STATUS"

POST_PID=$(extract_pid "$POST_STATUS")
RUNTIME_STATE=$(extract_runtime "$POST_STATUS")
RPC_STATE=$(extract_rpc "$POST_STATUS")

if [[ "$RUNTIME_STATE" != running* ]]; then
  log "ERROR: gateway runtime is not running"
  STATUS_OK=1
fi
if [[ "$RPC_STATE" != ok* ]]; then
  log "ERROR: RPC probe did not report ok"
  STATUS_OK=1
fi

printf '\naction: restart\nmethod: launchctl kickstart/bootstrap\nprev_pid: %s\ncurr_pid: %s\nruntime: %s\nrpc_probe: %s\nverdict: %s\n' \
  "$PRE_PID" "$POST_PID" "$RUNTIME_STATE" "$RPC_STATE" "$( [[ $STATUS_OK -eq 0 ]] && echo success || echo failure )"

if [[ $STATUS_OK -ne 0 ]]; then
  exit $STATUS_OK
fi

log "Gateway restart successful"
