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

SDK_ROOT="${ANDROID_SDK_ROOT:-$HOME/Library/Android/sdk}"
ADB_BIN="${ADB_BIN:-$SDK_ROOT/platform-tools/adb}"
PACKAGE_NAME="${PACKAGE_NAME:-com.cpt.electronicmenu.tv}"
SYSTEM_HOME_PACKAGE="${SYSTEM_HOME_PACKAGE:-com.mitv.tvhome}"

if [[ ! -x "$ADB_BIN" ]]; then
  echo "adb 不可用：$ADB_BIN" >&2
  exit 1
fi

adb_cmd() {
  "$ADB_BIN" -s "$TV_SERIAL" "$@"
}

select_device() {
  if [[ -n "${TV_SERIAL:-}" ]]; then
    if [[ "$TV_SERIAL" == *:* ]]; then
      "$ADB_BIN" connect "$TV_SERIAL" >/dev/null 2>&1 || true
    fi
    local state
    state="$($ADB_BIN -s "$TV_SERIAL" get-state 2>&1 || true)"
    if [[ "$state" == *"unauthorized"* ]]; then
      echo "目标电视 $TV_SERIAL 尚未授权 ADB（unauthorized）。" >&2
      echo "请在电视上勾选“始终允许这台电脑”并确认，然后重试。" >&2
      exit 2
    fi
    if [[ "$state" != "device" ]]; then
      echo "目标电视不可用：${TV_SERIAL}（状态：${state}）" >&2
      exit 2
    fi
    return
  fi

  local authorized unauthorized count
  authorized="$($ADB_BIN devices | awk 'NR>1 && $2 == "device" {print $1}')"
  unauthorized="$($ADB_BIN devices | awk 'NR>1 && $2 == "unauthorized" {print $1}')"
  if [[ -n "$unauthorized" ]]; then
    echo "发现未授权设备：$unauthorized" >&2
    echo "请先在目标电视上确认 ADB 授权，再通过 TV_SERIAL 精确指定。" >&2
    exit 2
  fi
  count="$(printf '%s\n' "$authorized" | awk 'NF {count++} END {print count+0}')"
  if [[ "$count" -eq 0 ]]; then
    echo "未发现已授权的电视。" >&2
    exit 2
  fi
  if [[ "$count" -gt 1 ]]; then
    echo "发现多台设备，请使用 TV_SERIAL 指定目标：" >&2
    printf '%s\n' "$authorized" >&2
    exit 2
  fi
  TV_SERIAL="$authorized"
}

value_or_unknown() {
  local value="$1"
  if [[ -n "$value" ]]; then
    printf '%s' "$value"
  else
    printf '%s' '未知'
  fi
}

select_device

MANUFACTURER="$(adb_cmd shell getprop ro.product.manufacturer 2>/dev/null | tr -d '\r')"
MODEL="$(adb_cmd shell getprop ro.product.model 2>/dev/null | tr -d '\r')"
ANDROID_VERSION="$(adb_cmd shell getprop ro.build.version.release 2>/dev/null | tr -d '\r')"
SDK_VERSION="$(adb_cmd shell getprop ro.build.version.sdk 2>/dev/null | tr -d '\r')"
BOOT_COMPLETED="$(adb_cmd shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')"

echo "=== 电视基本信息 ==="
echo "ADB 序列号：$TV_SERIAL"
echo "厂商/型号：$(value_or_unknown "$MANUFACTURER") / $(value_or_unknown "$MODEL")"
echo "Android / SDK：$(value_or_unknown "$ANDROID_VERSION") / $(value_or_unknown "$SDK_VERSION")"
echo "开机完成：$(value_or_unknown "$BOOT_COMPLETED")"

PACKAGE_PATH="$(adb_cmd shell pm path "$PACKAGE_NAME" 2>/dev/null | tr -d '\r')"
if [[ -z "$PACKAGE_PATH" && "$PACKAGE_NAME" == *.debug ]]; then
  RELEASE_PACKAGE="${PACKAGE_NAME%.debug}"
  RELEASE_PATH="$(adb_cmd shell pm path "$RELEASE_PACKAGE" 2>/dev/null | tr -d '\r')"
  if [[ -n "$RELEASE_PATH" ]]; then
    PACKAGE_NAME="$RELEASE_PACKAGE"
    PACKAGE_PATH="$RELEASE_PATH"
  fi
fi

echo
echo "=== 应用状态 ==="
echo "目标包名：$PACKAGE_NAME"
if [[ -z "$PACKAGE_PATH" ]]; then
  echo "安装状态：未安装"
  echo
  echo "结论：目标电视未安装电子菜牌 APK。"
  exit 3
fi
echo "安装状态：已安装"
echo "APK 路径：$PACKAGE_PATH"

PACKAGE_DUMP="$(adb_cmd shell dumpsys package "$PACKAGE_NAME" 2>/dev/null | tr -d '\r')"
STOPPED_STATE="$(printf '%s\n' "$PACKAGE_DUMP" | grep -E -m1 'stopped=' || true)"
ENABLED_STATE="$(printf '%s\n' "$PACKAGE_DUMP" | grep -E -m1 'enabled=' || true)"
BOOT_RECEIVER="$(printf '%s\n' "$PACKAGE_DUMP" | grep -E -m1 'BootReceiver|BOOT_COMPLETED' || true)"
echo "停止标记：$(value_or_unknown "$STOPPED_STATE")"
echo "启用状态：$(value_or_unknown "$ENABLED_STATE")"
echo "开机接收器：$(value_or_unknown "$BOOT_RECEIVER")"

HOME_COMPONENT="$(adb_cmd shell cmd package resolve-activity --brief -a android.intent.action.MAIN -c android.intent.category.HOME 2>/dev/null | tr -d '\r' | tail -1)"
HOME_ROLE="$(adb_cmd shell cmd role get-role-holders android.app.role.HOME 0 2>/dev/null | tr -d '\r' || true)"
RESUMED="$(adb_cmd shell dumpsys activity activities 2>/dev/null | grep -E 'topResumedActivity|mResumedActivity' | head -1 | tr -d '\r' || true)"
if [[ -z "$RESUMED" ]]; then
  RESUMED="$(adb_cmd shell dumpsys window windows 2>/dev/null | grep -E 'mCurrentFocus|mFocusedApp' | head -1 | tr -d '\r' || true)"
fi

echo
echo "=== 桌面与前台 ==="
echo "默认 Home：$(value_or_unknown "$HOME_COMPONENT")"
echo "Home 角色持有者：$(value_or_unknown "$HOME_ROLE")"
echo "当前前台：$(value_or_unknown "$RESUMED")"

SYSTEM_HOME_PATH="$(adb_cmd shell pm path "$SYSTEM_HOME_PACKAGE" 2>/dev/null | tr -d '\r')"
SYSTEM_HOME_DISABLED="$(adb_cmd shell pm list packages -d 2>/dev/null | grep -F "package:$SYSTEM_HOME_PACKAGE" || true)"
echo "小米桌面安装：$(value_or_unknown "$SYSTEM_HOME_PATH")"
if [[ -n "$SYSTEM_HOME_DISABLED" ]]; then
  echo "小米桌面状态：已停用"
else
  echo "小米桌面状态：已启用"
fi

DEVICE_IDLE="$(adb_cmd shell dumpsys deviceidle whitelist 2>/dev/null | grep -F "$PACKAGE_NAME" | tr -d '\r' || true)"
APP_OPS="$(adb_cmd shell cmd appops get "$PACKAGE_NAME" 2>/dev/null | grep -E 'RUN_IN_BACKGROUND|RUN_ANY_IN_BACKGROUND|START_FOREGROUND|SYSTEM_ALERT_WINDOW' | tr -d '\r' || true)"

echo
echo "=== 后台限制 ==="
echo "Doze 白名单：$(value_or_unknown "$DEVICE_IDLE")"
echo "相关 AppOps："
if [[ -n "$APP_OPS" ]]; then
  printf '%s\n' "$APP_OPS"
else
  echo "未读到（部分电视固件不提供标准 AppOps 输出）"
fi

echo
echo "=== 最近开机日志 ==="
BOOT_LOGS="$(adb_cmd logcat -d -t 500 2>/dev/null | grep -E 'ElectronicMenuBoot|Background activity start|BackgroundActivityStart|BOOT_COMPLETED|not allowed to start|Permission Denial' | tail -80 || true)"
if [[ -n "$BOOT_LOGS" ]]; then
  printf '%s\n' "$BOOT_LOGS"
else
  echo "未读到相关日志；需在下次重启后立即重新诊断。"
fi

echo
if [[ -z "$SYSTEM_HOME_PATH" || -n "$SYSTEM_HOME_DISABLED" ]]; then
  echo "结论：小米系统桌面不存在或被停用，不符合遥控待机/唤醒安全要求。"
  echo "下一步：先恢复并启用小米桌面，再继续验收。"
  exit 4
fi
if [[ "$HOME_COMPONENT" != "$PACKAGE_NAME"/* ]]; then
  echo "结论：电子菜牌还不是默认 Home，不能保证冷启动自动进入。"
  echo "下一步：在电视系统提示中选择电子菜牌并选择“始终”。"
  exit 5
fi
if [[ "$RESUMED" != *"$PACKAGE_NAME"* ]]; then
  echo "结论：电子菜牌已是默认 Home，但当前前台不是电子菜牌。"
  echo "下一步：按一次遥控器 Home 键后重新诊断。"
  exit 6
fi

echo "结论：电子菜牌是默认 Home，小米桌面仍启用，当前前台页面为电子菜牌。"
echo "注意：本次仅为当前状态诊断；是否真正开机自启仍以断电重启后的回读结果为准。"
