#!/usr/bin/env bash
set -u

APP="${APP:-com.cpt.electronicmenu.tv}"
PORT="${PORT:-5555}"
BOOT_WAIT="${BOOT_WAIT:-300}"
POLL_INTERVAL="${POLL_INTERVAL:-5}"

usage() {
  printf 'Usage: %s [--yes] <ip>\n' "$0"
  printf 'Dry-run is default. Add --yes to reboot and verify.\n'
}

YES=0
if [ "${1:-}" = "--yes" ]; then
  YES=1
  shift
fi

IP="${1:-}"
if [ -z "$IP" ]; then
  usage
  exit 2
fi

SERIAL="$IP:$PORT"
RUN_ID="$(date '+%Y%m%d-%H%M%S')"
LOG_DIR="${LOG_DIR:-logs/reboot-verify-$RUN_ID}"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/$IP.log"
SUMMARY="$LOG_DIR/summary.txt"
: >"$LOG_FILE"

log() {
  printf '[%s] %s\n' "$(date '+%F %T')" "$*" | tee -a "$LOG_FILE"
}

adb_for() {
  adb -s "$SERIAL" "$@"
}

connect_device() {
  adb connect "$SERIAL" >>"$LOG_FILE" 2>&1 || true
  adb_for get-state 2>&1 || true
}

wait_for_device() {
  elapsed=0
  while [ "$elapsed" -le "$BOOT_WAIT" ]; do
    state="$(connect_device | tr -d '\r')"
    log "poll elapsed=${elapsed}s state=$state"
    if [ "$state" = "device" ]; then
      return 0
    fi
    sleep "$POLL_INTERVAL"
    elapsed=$((elapsed + POLL_INTERVAL))
  done
  return 1
}

wait_for_reboot_start() {
  elapsed=0
  while [ "$elapsed" -le 90 ]; do
    state="$(adb_for get-state 2>&1 | tr -d '\r' || true)"
    log "wait_reboot_start elapsed=${elapsed}s state=$state"
    if [ "$state" != "device" ]; then
      return 0
    fi
    sleep "$POLL_INTERVAL"
    elapsed=$((elapsed + POLL_INTERVAL))
  done
  return 1
}

log "serial=$SERIAL app=$APP dry_run=$((1 - YES))"
state="$(connect_device | tr -d '\r')"
log "initial_state=$state"
if [ "$state" != "device" ]; then
  printf 'FAIL initial_state %s\n' "$state" >"$SUMMARY"
  exit 1
fi

before="$(adb_for shell settings get system start_3rd_app 2>&1 | tr -d '\r')"
log "before_start_3rd_app=$before"
if [ "$before" != "$APP" ]; then
  printf 'FAIL before_setting actual=%s\n' "$before" >"$SUMMARY"
  exit 1
fi

if [ "$YES" -ne 1 ]; then
  log "dry-run, would reboot and verify foreground app"
  printf 'DRY_RUN ready\n' >"$SUMMARY"
  exit 0
fi

log "sending reboot"
adb_for reboot >>"$LOG_FILE" 2>&1 || true

if ! wait_for_reboot_start; then
  printf 'FAIL reboot_did_not_leave_device_state\n' >"$SUMMARY"
  exit 1
fi

if ! wait_for_device; then
  printf 'FAIL wait_for_device timeout=%s\n' "$BOOT_WAIT" >"$SUMMARY"
  exit 1
fi

after="$(adb_for shell settings get system start_3rd_app 2>&1 | tr -d '\r')"
log "after_start_3rd_app=$after"
if [ "$after" != "$APP" ]; then
  printf 'FAIL after_setting actual=%s\n' "$after" >"$SUMMARY"
  exit 1
fi

top_activity="$(adb_for shell dumpsys activity activities 2>/dev/null | grep -E 'topResumedActivity|mResumedActivity|ResumedActivity' | head -n 5 | tr -d '\r' || true)"
log "activity_probe=$top_activity"

if printf '%s\n' "$top_activity" | grep -q "$APP"; then
  printf 'OK foreground_app=%s\n' "$APP" >"$SUMMARY"
  log "OK foreground app detected"
  exit 0
fi

current_window="$(adb_for shell dumpsys window 2>/dev/null | grep -E 'mCurrentFocus|mFocusedApp' | head -n 5 | tr -d '\r' || true)"
log "window_probe=$current_window"
if printf '%s\n' "$current_window" | grep -q "$APP"; then
  printf 'OK foreground_window=%s\n' "$APP" >"$SUMMARY"
  log "OK foreground window detected"
  exit 0
fi

printf 'PARTIAL setting_ok_foreground_not_detected\n' >"$SUMMARY"
log "PARTIAL setting persisted, foreground app not detected by dumpsys"
exit 3
