#!/bin/bash
# monitor — watch your screen for text changes
#
# Takes periodic screenshots, OCRs them, and alerts when the text
# changes from the previous capture. Great for monitoring dashboards,
# deploy logs, build status, etc.
#
# Usage:
#   monitor                       # watch every 30s (default)
#   monitor -i 10                 # check every 10 seconds
#   monitor -g "error"            # only alert when "error" appears
#   monitor -g "SUCCESS"          # wait for "SUCCESS" to appear
#
# Examples:
#   monitor -g "Build succeeded"  # wait for build to finish
#   monitor -g "error" -i 5      # watch for errors every 5s
#   monitor -i 60                 # check screen every minute
#
# Requires: auge

set -euo pipefail

interval=30
grep_pattern=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    -i|--interval) interval="${2:-30}"; shift 2 ;;
    -g|--grep)     grep_pattern="${2:-}"; shift 2 ;;
    -h|--help)
      sed -n '2,/^$/{ s/^# //; s/^#//; p; }' "$0"
      exit 0 ;;
    *) echo "unknown option: $1" >&2; exit 2 ;;
  esac
done

command -v auge >/dev/null || { echo "error: auge not found" >&2; exit 1; }

tmp=$(mktemp /tmp/monitor-XXXXXX.png)
trap 'rm -f "$tmp"' EXIT

prev_hash=""

printf '\033[2m[monitor] watching screen every %ss' "$interval"
[[ -n "$grep_pattern" ]] && printf ' for "%s"' "$grep_pattern"
printf ' (ctrl+c to stop)\033[0m\n'

while true; do
  screencapture -x "$tmp" 2>/dev/null
  text=$(auge --ocr "$tmp" -q 2>/dev/null)
  curr_hash=$(echo "$text" | md5 -q 2>/dev/null || echo "$text" | md5sum | cut -d' ' -f1)

  ts=$(date +"%H:%M:%S")

  if [[ -n "$grep_pattern" ]]; then
    if echo "$text" | grep -qi "$grep_pattern"; then
      printf '\033[32m[%s] MATCH: "%s" found on screen\033[0m\n' "$ts" "$grep_pattern"
      # Show the matching lines
      echo "$text" | grep -i "$grep_pattern" | head -5
      exit 0
    else
      printf '\033[2m[%s] no match for "%s"\033[0m\n' "$ts" "$grep_pattern"
    fi
  else
    if [[ "$curr_hash" != "$prev_hash" ]] && [[ -n "$prev_hash" ]]; then
      printf '\033[33m[%s] screen text changed\033[0m\n' "$ts"
    else
      printf '\033[2m[%s] no change\033[0m\n' "$ts"
    fi
    prev_hash="$curr_hash"
  fi

  sleep "$interval"
done
