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

PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
SAFE_APK_PATH="$PROJECT_DIR/../../../downloads/electronic-menu-tv-rdfz-v1.3.10-release-signed.apk"
APK_PATH="${1:-$SAFE_APK_PATH}"
SDK_ROOT="${ANDROID_SDK_ROOT:-$HOME/Library/Android/sdk}"
ADB_BIN="${ADB_BIN:-$SDK_ROOT/platform-tools/adb}"
AAPT_BIN="${AAPT_BIN:-$(find "$SDK_ROOT/build-tools" -type f -name aapt | sort -V | tail -1)}"
SYSTEM_HOME_PACKAGE="${SYSTEM_HOME_PACKAGE:-com.mitv.tvhome}"
SYSTEM_HOME_COMPONENT="${SYSTEM_HOME_COMPONENT:-$SYSTEM_HOME_PACKAGE/.MainActivityUserMode}"
VERIFY_REBOOT="${VERIFY_REBOOT:-0}"
BOOT_VERIFY_TIMEOUT_SECONDS="${BOOT_VERIFY_TIMEOUT_SECONDS:-180}"

if [[ -z "${TV_SERIAL:-}" ]]; then
  echo "必须通过 TV_SERIAL 精确指定目标小米电视。" >&2
  exit 2
fi
if [[ "${CONFIRM_DISABLE_SYSTEM_HOME:-}" != "YES" ]]; then
  echo "拒绝操作：必须显式设置 CONFIRM_DISABLE_SYSTEM_HOME=YES。" >&2
  echo "此模式会停用用户 0 的小米桌面，并可能影响遥控待机唤醒。" >&2
  exit 2
fi
if [[ ! -f "$APK_PATH" ]]; then
  echo "APK 不存在：$APK_PATH" >&2
  exit 1
fi
if ! [[ "$BOOT_VERIFY_TIMEOUT_SECONDS" =~ ^[1-9][0-9]*$ ]]; then
  echo "BOOT_VERIFY_TIMEOUT_SECONDS 必须是正整数。" >&2
  exit 1
fi

if [[ "$TV_SERIAL" == *:* ]]; then
  "$ADB_BIN" connect "$TV_SERIAL" >/dev/null 2>&1 || true
fi
STATE="$($ADB_BIN -s "$TV_SERIAL" get-state 2>&1 || true)"
if [[ "$STATE" != "device" ]]; then
  echo "目标电视不可用：${TV_SERIAL}（状态：${STATE}）" >&2
  exit 2
fi

PACKAGE_NAME="$($AAPT_BIN dump badging "$APK_PATH" | sed -n "s/^package: name='\([^']*\)'.*/\1/p")"
VERSION_NAME="$($AAPT_BIN dump badging "$APK_PATH" | sed -n "s/^package: .*versionName='\([^']*\)'.*/\1/p")"
if [[ -z "$PACKAGE_NAME" ]]; then
  echo "无法读取 APK 包名。" >&2
  exit 1
fi
if [[ "$PACKAGE_NAME" != "com.cpt.electronicmenu.tv" ]]; then
  echo "拒绝操作：只允许 RDFZ 正式包，实际包名为 $PACKAGE_NAME。" >&2
  exit 3
fi
if [[ "$VERSION_NAME" != "1.3.10" ]]; then
  echo "拒绝操作：只允许已移除失效弹窗的 1.3.10 正式包，实际版本为 $VERSION_NAME。" >&2
  exit 3
fi

MANIFEST_DUMP="$($AAPT_BIN dump xmltree "$APK_PATH" AndroidManifest.xml)"
if printf '%s\n' "$MANIFEST_DUMP" | grep -Eq \
  'android\.permission\.(WAKE_LOCK|USE_FULL_SCREEN_INTENT)|android:(turnScreenOn|showWhenLocked).*0xffffffff|QUICKBOOT_POWERON|SCREEN_ON'; then
  echo "拒绝操作：APK Manifest 含主动唤醒、常亮或快速开机风险标记。" >&2
  exit 3
fi
if for dex in $(unzip -Z1 "$APK_PATH" | grep -E '^classes[0-9]*\.dex$'); do
  unzip -p "$APK_PATH" "$dex" | strings -a
done | grep -E 'setFullScreenIntent|FLAG_KEEP_SCREEN_ON|QUICKBOOT_POWERON|android\.intent\.action\.SCREEN_ON' >/dev/null; then
  echo "拒绝操作：APK DEX 含已废弃的电源/唤醒实现。" >&2
  exit 3
fi
ACTIVITY="$PACKAGE_NAME/com.cpt.electronicmenu.tv.MainActivity"
HOME_ALIAS="$PACKAGE_NAME/com.cpt.electronicmenu.tv.ManagedHomeActivity"
RESTORE_SCRIPT="$PROJECT_DIR/tools/restore-system-home.sh"

if [[ ! -x "$RESTORE_SCRIPT" ]]; then
  echo "恢复脚本不可执行：$RESTORE_SCRIPT" >&2
  exit 3
fi
if [[ -z "$($ADB_BIN -s "$TV_SERIAL" shell pm path "$SYSTEM_HOME_PACKAGE" 2>/dev/null | tr -d '\r')" ]]; then
  echo "未找到小米桌面包：$SYSTEM_HOME_PACKAGE" >&2
  exit 3
fi

rollback_on_error() {
  local status=$?
  trap - EXIT
  if [[ "$status" -ne 0 ]]; then
    echo "强制 Home 配置失败，正在恢复小米桌面……" >&2
    TV_SERIAL="$TV_SERIAL" SYSTEM_HOME_PACKAGE="$SYSTEM_HOME_PACKAGE" \
      SYSTEM_HOME_COMPONENT="$SYSTEM_HOME_COMPONENT" "$RESTORE_SCRIPT" >/dev/null 2>&1 || true
  fi
  exit "$status"
}
trap rollback_on_error EXIT

"$ADB_BIN" -s "$TV_SERIAL" install -r -t "$APK_PATH"
"$ADB_BIN" -s "$TV_SERIAL" shell am start -n "$ACTIVITY" --ez enable_auto_start true
sleep 2

RESUMED="$($ADB_BIN -s "$TV_SERIAL" shell dumpsys activity activities | grep -E 'topResumedActivity|mResumedActivity' | head -1 | tr -d '\r' || true)"
if [[ "$RESUMED" != *"$PACKAGE_NAME"* ]]; then
  echo "电子菜牌无法显式启动，拒绝停用小米桌面：$RESUMED" >&2
  exit 3
fi

echo "恢复命令：TV_SERIAL='$TV_SERIAL' '$RESTORE_SCRIPT'"
"$ADB_BIN" -s "$TV_SERIAL" shell pm disable-user --user 0 "$SYSTEM_HOME_PACKAGE"
"$ADB_BIN" -s "$TV_SERIAL" shell cmd package set-home-activity "$HOME_ALIAS"
"$ADB_BIN" -s "$TV_SERIAL" shell input keyevent HOME
sleep 2

HOME_COMPONENT="$($ADB_BIN -s "$TV_SERIAL" shell cmd package resolve-activity --brief -a android.intent.action.MAIN -c android.intent.category.HOME 2>/dev/null | tr -d '\r' | tail -1)"
RESUMED="$($ADB_BIN -s "$TV_SERIAL" shell dumpsys activity activities | grep -E 'topResumedActivity|mResumedActivity' | head -1 | tr -d '\r' || true)"
DISABLED="$($ADB_BIN -s "$TV_SERIAL" shell pm list packages -d | grep -F "package:$SYSTEM_HOME_PACKAGE" || true)"

echo "当前默认 Home：$HOME_COMPONENT"
echo "当前前台页面：$RESUMED"
echo "小米桌面停用状态：${DISABLED:-未回读到}"
if [[ "$HOME_COMPONENT" != "$PACKAGE_NAME"/* ]] || [[ "$RESUMED" != *"$PACKAGE_NAME"* ]] || [[ -z "$DISABLED" ]]; then
  echo "强制 Home 回读不一致。" >&2
  exit 3
fi

if [[ "$VERIFY_REBOOT" == "1" ]]; then
  echo "正在重启电视；网络 ADB 若被小米关闭，需以现场画面补充验收。"
  "$ADB_BIN" -s "$TV_SERIAL" reboot
  CONNECTED=0
  for _ in $(seq 1 "$BOOT_VERIFY_TIMEOUT_SECONDS"); do
    "$ADB_BIN" connect "$TV_SERIAL" >/dev/null 2>&1 || true
    if [[ "$($ADB_BIN -s "$TV_SERIAL" get-state 2>/dev/null || true)" == "device" ]]; then
      CONNECTED=1
      BOOT_COMPLETED="$($ADB_BIN -s "$TV_SERIAL" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r' || true)"
      [[ "$BOOT_COMPLETED" == "1" ]] && break
    fi
    sleep 1
  done
  if [[ "$CONNECTED" != "1" ]] || [[ "${BOOT_COMPLETED:-}" != "1" ]]; then
    trap - EXIT
    echo "电视已发送重启命令，但网络 ADB 未在时限内恢复；请现场确认是否显示电子菜牌。" >&2
    exit 4
  fi

  HOME_COMPONENT="$($ADB_BIN -s "$TV_SERIAL" shell cmd package resolve-activity --brief -a android.intent.action.MAIN -c android.intent.category.HOME 2>/dev/null | tr -d '\r' | tail -1)"
  RESUMED="$($ADB_BIN -s "$TV_SERIAL" shell dumpsys activity activities | grep -E 'topResumedActivity|mResumedActivity' | head -1 | tr -d '\r' || true)"
  DISABLED="$($ADB_BIN -s "$TV_SERIAL" shell pm list packages -d --user 0 | grep -F "package:$SYSTEM_HOME_PACKAGE" || true)"
  echo "重启后 sys.boot_completed=$BOOT_COMPLETED"
  echo "重启后默认 Home：$HOME_COMPONENT"
  echo "重启后前台页面：$RESUMED"
  echo "重启后小米桌面停用状态：${DISABLED:-未回读到}"
  if [[ "$HOME_COMPONENT" != "$PACKAGE_NAME"/* ]] || [[ "$RESUMED" != *"$PACKAGE_NAME"* ]] || [[ -z "$DISABLED" ]]; then
    echo "重启后强制 Home 状态不完整。" >&2
    exit 4
  fi
  echo "小米电视冷启动自启验证通过。"
fi

trap - EXIT
echo "强制 Home 配置完成；仍需按交付门禁验证实体遥控待机/唤醒。"
