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

PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
APK_PATH="${1:-$PROJECT_DIR/../../../downloads/electronic-menu-tv-rdfz-v1.3.10-release-signed.apk}"
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}"
HOME_CONFIRM_TIMEOUT_SECONDS="${HOME_CONFIRM_TIMEOUT_SECONDS:-180}"

if [[ -z "${TV_SERIAL:-}" ]]; then
  echo "必须通过 TV_SERIAL 精确指定本次验收的红米/小米电视。" >&2
  exit 2
fi
if [[ ! -f "$APK_PATH" ]]; then
  echo "APK 不存在：$APK_PATH" >&2
  exit 1
fi
if ! [[ "$HOME_CONFIRM_TIMEOUT_SECONDS" =~ ^[1-9][0-9]*$ ]]; then
  echo "HOME_CONFIRM_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
  echo "请只在本次样机验收时确认一次 ADB；20 台现场安装不依赖 ADB。" >&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 "$AAPT_BIN" dump badging "$APK_PATH" | grep -q "testOnly='"; then
  echo "拒绝安装：APK 带 testOnly 标记，不能作为电视普通安装候选包。" >&2
  exit 3
fi

MANIFEST_DUMP="$($AAPT_BIN dump xmltree "$APK_PATH" AndroidManifest.xml)"
if ! printf '%s\n' "$MANIFEST_DUMP" | grep -q 'android.intent.category.HOME'; then
  echo "拒绝安装：APK 未声明 Home 候选。" >&2
  exit 3
fi
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

MANUFACTURER="$($ADB_BIN -s "$TV_SERIAL" shell getprop ro.product.manufacturer 2>/dev/null | tr -d '\r')"
MODEL="$($ADB_BIN -s "$TV_SERIAL" shell getprop ro.product.model 2>/dev/null | tr -d '\r')"
ANDROID_VERSION="$($ADB_BIN -s "$TV_SERIAL" shell getprop ro.build.version.release 2>/dev/null | tr -d '\r')"
echo "目标设备：${MANUFACTURER:-未知} ${MODEL:-未知} / Android ${ANDROID_VERSION:-未知}"
DEVICE_IDENTITY="$(printf '%s %s' "$MANUFACTURER" "$MODEL" | tr '[:upper:]' '[:lower:]')"
case "$DEVICE_IDENTITY" in
  *xiaomi*|*redmi*|*mitv*) ;;
  *)
    echo "拒绝安装：当前设备未识别为红米/小米电视，请确认 TV_SERIAL。" >&2
    exit 3
    ;;
esac

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
if "$ADB_BIN" -s "$TV_SERIAL" shell pm list packages -d | grep -q "package:$SYSTEM_HOME_PACKAGE"; then
  echo "检测到小米桌面被停用，正在恢复后再继续。"
  "$ADB_BIN" -s "$TV_SERIAL" shell pm enable --user 0 "$SYSTEM_HOME_PACKAGE"
fi

ACTIVITY="$PACKAGE_NAME/com.cpt.electronicmenu.tv.MainActivity"
HOME_ALIAS="$PACKAGE_NAME/com.cpt.electronicmenu.tv.ManagedHomeActivity"
"$ADB_BIN" -s "$TV_SERIAL" install -r "$APK_PATH"
"$ADB_BIN" -s "$TV_SERIAL" shell pm enable "$PACKAGE_NAME/com.cpt.electronicmenu.tv.BootReceiver" >/dev/null
"$ADB_BIN" -s "$TV_SERIAL" shell pm enable "$HOME_ALIAS" >/dev/null
"$ADB_BIN" -s "$TV_SERIAL" shell am start -n "$ACTIVITY" >/dev/null

echo "已安装：$PACKAGE_NAME / $VERSION_NAME"
echo "请在电视上使用遥控器选择“电子菜牌”为默认桌面，并选择“始终”。"
echo "不会停用或卸载小米桌面；正在等待系统回读（最多 ${HOME_CONFIRM_TIMEOUT_SECONDS} 秒）……"

HOME_COMPONENT=""
for _ in $(seq 1 "$HOME_CONFIRM_TIMEOUT_SECONDS"); do
  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 || true)"
  [[ "$HOME_COMPONENT" == "$PACKAGE_NAME"/* ]] && break
  sleep 1
done

SYSTEM_HOME_DISABLED="$($ADB_BIN -s "$TV_SERIAL" shell pm list packages -d | grep -F "package:$SYSTEM_HOME_PACKAGE" || true)"
RESUMED="$($ADB_BIN -s "$TV_SERIAL" shell dumpsys activity activities 2>/dev/null \
  | grep -E 'topResumedActivity|mResumedActivity' | head -1 | tr -d '\r' || true)"
echo "当前默认 Home：${HOME_COMPONENT:-未回读到}"
echo "当前前台：${RESUMED:-未回读到}"
if [[ -n "$SYSTEM_HOME_DISABLED" ]]; then
  echo "小米桌面状态：已停用"
else
  echo "小米桌面状态：已启用"
fi

if [[ "$HOME_COMPONENT" != "$PACKAGE_NAME"/* ]]; then
  echo "验收未通过：尚未将电子菜牌设为默认 Home。" >&2
  exit 4
fi
if [[ -n "$SYSTEM_HOME_DISABLED" ]]; then
  echo "验收未通过：小米桌面仍处于停用状态。" >&2
  exit 4
fi
if [[ "$RESUMED" != *"$PACKAGE_NAME"* ]]; then
  "$ADB_BIN" -s "$TV_SERIAL" shell input keyevent HOME
  sleep 2
  RESUMED="$($ADB_BIN -s "$TV_SERIAL" shell dumpsys activity activities 2>/dev/null \
    | grep -E 'topResumedActivity|mResumedActivity' | head -1 | tr -d '\r' || true)"
fi
if [[ "$RESUMED" != *"$PACKAGE_NAME"* ]]; then
  echo "验收未通过：按 Home 后电子菜牌没有进入前台。" >&2
  exit 4
fi

echo "首次 Home 授权验证通过。下一步必须人工执行遥控待机/唤醒和断电冷启动门禁。"
