#!/usr/bin/env bash
set -euo pipefail

APP="${APP:-com.cpt.electronicmenu.tv}"
ADB="${ADB:-/Users/sunqianqian/Library/Android/sdk/platform-tools/adb}"
IP_FILE="${IP_FILE:-/Users/sunqianqian/Desktop/work/zhctprompt/work_store/xiaomi-tv-apk-autostart/tv_ips_watchdog.txt}"
LOG_FILE="${LOG_FILE:-/Users/sunqianqian/Desktop/work/zhctprompt/work_store/xiaomi-tv-apk-autostart/logs/tv-autostart-watchdog.log}"
INTERVAL_SECONDS="${INTERVAL_SECONDS:-20}"

mkdir -p "$(dirname "$LOG_FILE")"

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

is_foreground() {
  local serial="$1"
  "$ADB" -s "$serial" shell dumpsys activity activities 2>/dev/null \
    | grep -E 'topResumedActivity|mResumedActivity|mFocusedApp|mCurrentFocus' \
    | grep -q "$APP"
}

launch_app() {
  local serial="$1"
  "$ADB" -s "$serial" shell settings put system start_3rd_app "$APP" >/dev/null 2>&1 || true
  "$ADB" -s "$serial" shell monkey -p "$APP" -c android.intent.category.LAUNCHER 1 >/dev/null 2>&1 || true
  sleep 3
  "$ADB" -s "$serial" shell am start -n "$APP/.MainActivity" >/dev/null 2>&1 || true
}

while true; do
  if [[ ! -f "$IP_FILE" ]]; then
    log "IP file missing: $IP_FILE"
    sleep "$INTERVAL_SECONDS"
    continue
  fi

  while IFS= read -r ip || [[ -n "$ip" ]]; do
    ip="${ip%%#*}"
    ip="$(printf '%s' "$ip" | tr -d '[:space:]')"
    [[ -z "$ip" ]] && continue

    serial="$ip:5555"
    if ! nc -G 2 -z "$ip" 5555 >/dev/null 2>&1; then
      log "$serial port closed"
      continue
    fi

    "$ADB" connect "$serial" >/dev/null 2>&1 || true
    state="$("$ADB" devices | awk -v serial="$serial" '$1 == serial {print $2}')"
    if [[ "$state" != "device" ]]; then
      log "$serial adb state=${state:-missing}"
      continue
    fi

    if is_foreground "$serial"; then
      log "$serial already foreground"
      continue
    fi

    log "$serial launching $APP"
    launch_app "$serial"
    if is_foreground "$serial"; then
      log "$serial launch ok"
    else
      log "$serial launch attempted but foreground not confirmed"
    fi
  done < "$IP_FILE"

  sleep "$INTERVAL_SECONDS"
done
