#!/bin/zsh
set -euo pipefail

REPO="${REPO:-/Users/openclaw/.openclaw/workspace}"
STATE_FILE="${STATE_FILE:-$REPO/tmp/job-state/git-push.state}"
ALERT_STATE="${ALERT_STATE:-$REPO/tmp/job-state/git-push-failure-alert.state}"
LOG_FILE="${LOG_FILE:-$REPO/tmp/git-push-failure-alert.log}"

OPENCLAW_BIN="${OPENCLAW_BIN:-/opt/homebrew/bin/openclaw}"
TELEGRAM_CHANNEL="${TELEGRAM_CHANNEL:-telegram}"
TELEGRAM_TARGET="${TELEGRAM_TARGET:-8032472383}"

AHEAD_THRESHOLD="${AHEAD_THRESHOLD:-50}"
MAX_SUCCESS_AGE_HOURS="${MAX_SUCCESS_AGE_HOURS:-24}"
ALERT_COOLDOWN_SECS="${ALERT_COOLDOWN_SECS:-21600}"
REMOTE_REF="${REMOTE_REF:-origin/main}"

mkdir -p "$REPO/tmp" "$REPO/tmp/job-state"

now_epoch() { date +%s; }
now_human() { date '+%Y-%m-%d %H:%M:%S %Z'; }

log() {
  printf '[%s] %s\n' "$(now_human)" "$1" >> "$LOG_FILE"
}

load_shell_state() {
  local path="$1"
  if [[ -f "$path" ]]; then
    # shellcheck disable=SC1090
    source "$path"
  fi
}

LAST_SUCCESS_EPOCH=0
LAST_SUCCESS_HEAD=""
LAST_ALERT_EPOCH=0
LAST_ALERT_REASON=""

load_push_state() {
  FAIL_COUNT=0
  FIRST_FAIL_EPOCH=0
  LAST_SUCCESS_EPOCH=0
  ALERT_SENT=0
  LAST_ERROR=""
  load_shell_state "$STATE_FILE"
}

load_alert_state() {
  load_shell_state "$ALERT_STATE"
}

write_alert_state() {
  cat > "$ALERT_STATE" <<EOF
LAST_ALERT_EPOCH=$LAST_ALERT_EPOCH
LAST_ALERT_REASON=$(printf %q "$LAST_ALERT_REASON")
LAST_SUCCESS_EPOCH=$LAST_SUCCESS_EPOCH
LAST_SUCCESS_HEAD=$(printf %q "$LAST_SUCCESS_HEAD")
EOF
}

send_alert() {
  local message="$1"
  if "$OPENCLAW_BIN" message send --channel "$TELEGRAM_CHANNEL" --target "$TELEGRAM_TARGET" --message "$message" >/dev/null 2>&1; then
    log "alert_sent message=$(printf %q "$message")"
    return 0
  fi
  log "alert_failed message=$(printf %q "$message")"
  return 1
}

cd "$REPO"

if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
  log "not_a_git_repo"
  exit 1
fi

load_push_state
load_alert_state

counts_raw="$(git rev-list --left-right --count "$REMOTE_REF"...HEAD 2>/dev/null || echo '0 0')"
counts_raw="${counts_raw//$'\t'/ }"
counts=(${=counts_raw})
behind_count="${counts[1]:-0}"
ahead_count="${counts[2]:-0}"
head_hash="$(git rev-parse --short HEAD 2>/dev/null || echo unknown)"

reason=""
reason_detail=""
if (( ahead_count >= AHEAD_THRESHOLD )); then
  reason="ahead_threshold"
  reason_detail="ahead=${ahead_count} threshold=${AHEAD_THRESHOLD}"
fi

if [[ -z "$reason" ]] && (( LAST_SUCCESS_EPOCH > 0 )); then
  age_secs=$(( $(now_epoch) - LAST_SUCCESS_EPOCH ))
  max_age_secs=$(( MAX_SUCCESS_AGE_HOURS * 3600 ))
  if (( age_secs >= max_age_secs )); then
    reason="stale_last_success"
    reason_detail="last_success_age_hours=$(( age_secs / 3600 )) limit=${MAX_SUCCESS_AGE_HOURS}"
  fi
fi

if [[ -z "$reason" ]]; then
  log "ok ahead=${ahead_count} behind=${behind_count} head=${head_hash}"
  exit 0
fi

now_ts="$(now_epoch)"
if (( LAST_ALERT_EPOCH > 0 )) && (( now_ts - LAST_ALERT_EPOCH < ALERT_COOLDOWN_SECS )) && [[ "$LAST_ALERT_REASON" == "$reason" ]]; then
  log "suppressed reason=${reason} ahead=${ahead_count} behind=${behind_count} cooldown_remaining=$(( ALERT_COOLDOWN_SECS - (now_ts - LAST_ALERT_EPOCH) ))"
  exit 0
fi

message="[GIT PUSH ALERT] workspace backup drift detected: ${reason}. ahead=${ahead_count}, behind=${behind_count}, head=${head_hash}, ${reason_detail}. Review /Users/openclaw/.openclaw/workspace and staged THR-116 alert/bootstrap files."

if send_alert "$message"; then
  LAST_ALERT_EPOCH=$now_ts
  LAST_ALERT_REASON="$reason"
  LAST_SUCCESS_HEAD="$head_hash"
  write_alert_state
  exit 0
fi

exit 1
