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

PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
APK_PATH="${1:-$PROJECT_DIR/app/build/outputs/apk/debug/app-debug.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)}"

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 [[ "$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")"
if [[ -z "$PACKAGE_NAME" ]]; then
  echo "无法读取 APK 包名" >&2
  exit 1
fi
ADMIN_COMPONENT="$PACKAGE_NAME/com.cpt.electronicmenu.tv.KioskDeviceAdminReceiver"
ACTIVITY="$PACKAGE_NAME/com.cpt.electronicmenu.tv.MainActivity"

"$ADB_BIN" -s "$TV_SERIAL" install -r -t "$APK_PATH"
echo "正在设置 Device Owner：$ADMIN_COMPONENT"
if ! OWNER_RESULT="$($ADB_BIN -s "$TV_SERIAL" shell dpm set-device-owner "$ADMIN_COMPONENT" 2>&1)"; then
  printf '%s\n' "$OWNER_RESULT" >&2
  echo "Device Owner 设置失败。目标设备必须尚未完成初始化、没有账号且没有其他 Device Owner。" >&2
  echo "本脚本不会自动恢复出厂；请按设备交付流程人工清空后重新配置。" >&2
  exit 3
fi
printf '%s\n' "$OWNER_RESULT"

"$ADB_BIN" -s "$TV_SERIAL" shell am start -n "$ACTIVITY"
OWNER_DUMP="$($ADB_BIN -s "$TV_SERIAL" shell dumpsys device_policy 2>/dev/null | grep -E -m1 'Device Owner|mDeviceOwner|deviceOwner' || true)"
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)"
echo "Device Owner：${OWNER_DUMP:-未回读到}"
echo "当前默认 Home：${HOME_COMPONENT:-未回读到}"
echo "受管 kiosk 配置完成。请长按返回键 8 秒并使用 MDM 下发或构建注入的管理员 PIN 验证维护入口。"
