#!/usr/bin/env bash
# ============================================================
# setup.sh — Redroid + 富途 K線採集機 全自動建置 (Ubuntu 24.04 mini)
# 用法: bash setup.sh <step1|step2|step3|step4|step5|step6|step7>
# ============================================================
set -uo pipefail

DEV="127.0.0.1:5555"
SEED_BUILD="/root/redroid_seedbuild"      # 種子製作用臨時目錄
SEED_HK="/root/redroid_1hk"
SEED_US="/root/redroid_1us"
IMG="redroid/redroid:12.0.0_64only-latest"
FUTU_APK="/root/futu.apk"                 # <<< 自己上載 APK 到呢度
CN="redroid_seed"

A() { adb -s "$DEV" shell "$@"; }         # adb shell 捷徑

# ════════════════════════════════════════════
# STEP 1: 主機底層 (kernel / docker / python / 極致調優)
# ════════════════════════════════════════════
step1() {
  export DEBIAN_FRONTEND=noninteractive
  apt-get update -y
  apt-get install -y docker.io adb python3-pip curl psmisc \
    linux-modules-extra-$(uname -r)

  # --- binder 模組 (redroid 必需) ---
  modprobe binder_linux devices="binder,hwbinder,vndbinder"
  cat > /etc/modules-load.d/redroid.conf <<'EOF'
binder_linux
EOF
  cat > /etc/modprobe.d/redroid.conf <<'EOF'
options binder_linux devices=binder,hwbinder,vndbinder
EOF

  # --- 極致：CPU governor 鎖 performance (VPS 無就跳過) ---
  for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    [ -w "$g" ] && echo performance > "$g" || true
  done

  # --- 極致：關 swap (防止 0.8 核浪費喺 swap I/O) ---
  swapoff -a || true
  sed -i '/\sswap\s/ s/^/#/' /etc/fstab

  # --- 極致：sysctl 調優 ---
  cat > /etc/sysctl.d/99-redroid.conf <<'EOF'
vm.swappiness=1
vm.overcommit_memory=1
vm.dirty_ratio=30
vm.dirty_background_ratio=10
fs.inotify.max_user_instances=1024
fs.inotify.max_user_watches=524288
kernel.sched_autogroup_enabled=0
net.core.somaxconn=1024
EOF
  sysctl --system >/dev/null

  # --- 極致：/dev/shm 加大到 4G (放種子 + 容器 /data) ---
  grep -q '/dev/shm' /etc/fstab || \
    echo 'tmpfs /dev/shm tmpfs defaults,size=4G 0 0' >> /etc/fstab
  mount -o remount,size=4G /dev/shm

  # --- 極致：斬 Ubuntu 背景服務 (1 核機唔好俾 apt 搶 CPU) ---
  systemctl disable --now unattended-upgrades apt-daily.timer \
    apt-daily-upgrade.timer motd-news.timer 2>/dev/null || true
  systemctl disable --now snapd snapd.socket 2>/dev/null || true

  # --- docker daemon 調優 ---
  mkdir -p /etc/docker
  cat > /etc/docker/daemon.json <<'EOF'
{
  "storage-driver": "overlay2",
  "userland-proxy": false,
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {"max-size": "20m", "max-file": "2"}
}
EOF
  systemctl enable --now docker
  systemctl restart docker

  # --- python 依賴 (24.04 要 break-system-packages) ---
  pip3 install --break-system-packages uiautomator2==2.16.25 requests || \
  pip3 install --break-system-packages uiautomator2 requests

  docker pull "$IMG"
  mkdir -p ~/public
  echo "✅ STEP1 完成。上載富途 APK 到 $FUTU_APK 後跑 step2"
}

# ════════════════════════════════════════════
# STEP 2: 起種子製作容器 (與正式版完全相同 boot 參數 → 精準)
# ════════════════════════════════════════════
step2() {
  docker rm -f "$CN" 2>/dev/null
  rm -rf "$SEED_BUILD"; mkdir -p "$SEED_BUILD"; chmod 777 "$SEED_BUILD"
  mkdir -p /dev/shm/redroid_1

  docker run -itd --privileged --name "$CN" \
    -p 5555:5555 --dns 1.1.1.1 --dns 8.8.8.8 \
    --shm-size=2g --memory=4.5g --memory-swap=4.5g --cpus=1.0 \
    -v /dev/shm/redroid_1:/data/local/tmp \
    -v "$SEED_BUILD":/data \
    "$IMG" \
    androidboot.redroid_width=90 androidboot.redroid_height=790 \
    androidboot.redroid_dpi=72 \
    androidboot.redroid_fps=15 androidboot.redroid_gpu_mode=guest \
    androidboot.use_memfd=true \
    persist.sys.timezone=Asia/Hong_Kong persist.sys.locale=zh-HK \
    debug.sf.nobootanimation=1 \
    dalvik.vm.dex2oat-filter=speed dalvik.vm.image-dex2oat-filter=speed

  adb start-server
  for i in $(seq 1 30); do
    adb connect "$DEV" >/dev/null
    [ "$(A getprop sys.boot_completed 2>/dev/null | tr -d '\r')" = "1" ] && break
    sleep 3
  done
  echo "✅ STEP2 完成，Android 已開機。跑 step3 裝富途"
}

# ════════════════════════════════════════════
# STEP 3: 裝富途 + AOT 全量預編譯 + u2 預佈署 (免初始化)
# ════════════════════════════════════════════
step3() {
  [ -f "$FUTU_APK" ] || { echo "❌ 搵唔到 $FUTU_APK"; exit 1; }
  adb connect "$DEV" >/dev/null
  adb -s "$DEV" install -g "$FUTU_APK"

  # 極致關鍵①：AOT 預編譯成 speed，種子入面永久免 JIT (0.8核最大 CPU 節省)
  A cmd package compile -m speed -f cn.futu.trader
  A cmd package bg-dexopt-job cn.futu.trader || true

  # 極致關鍵②：預先俾 uiautomator2 初始化 (ATX agent 直接固化入種子)
  python3 - <<'PYEOF'
import uiautomator2 as u2
d = u2.connect("127.0.0.1:5555")
print("u2 ready:", d.info.get("productName"))
PYEOF

  cat <<'EOF'
════════════════════════════════════════════
✅ 已安裝 + 預編譯。而家用 scrcpy 連入去做人手設定：
   (本機) scrcpy -s 127.0.0.1:5555 --window-width 360

必做清單（精準）：
  1. 登入富途帳號
  2. 自選 → K線頁 → 切到 G1 指標
  3. 設定→隱私與推送：全部通知/牛牛圈推送 → 關
  4. 個股頁：滾動籌碼/籌碼分佈/資金流向 → 全關，只留純K線
  5. 停留喺自選列表頁
完成後跑 step4
════════════════════════════════════════════
EOF
}

# ════════════════════════════════════════════
# STEP 4: Android 系統級精簡 (逐項 || true 防炸)
# ════════════════════════════════════════════
step4() {
  adb connect "$DEV" >/dev/null

  # --- 停用無用套件 ---
  for p in com.android.bips com.android.printspooler com.android.bluetooth \
           com.android.bluetoothmidiservice com.android.providers.partnerbookmarks \
           com.android.wallpaperbackup com.android.dreams.basic \
           com.android.dreams.phototable com.android.musicfx \
           com.android.bookmarkprovider com.android.calllogbackup \
           com.android.emergency com.android.egg com.android.traceur; do
    A pm disable-user --user 0 "$p" 2>/dev/null || true
  done

  # --- 極致：全域關動畫 (dump 更快、渲染省 CPU) ---
  A settings put global window_animation_scale 0
  A settings put global transition_animation_scale 0
  A settings put global animator_duration_scale 0

  # --- 輸入法/驗證/日誌統計 ---
  A settings put secure spell_checker_enabled 0
  A settings put global package_verifier_enable 0 || true
  A settings put global verifier_verify_adb_installs 0 || true
  A settings put global activity_starts_logging_enabled 0 || true

  # --- 極致：cached process 上限壓到 3，唔俾雜 app 霸 RAM/CPU 輪詢 ---
  A device_config put activity_manager max_cached_processes 3 || true

  # --- 保富途唔俾系統殺 ---
  A cmd appops set cn.futu.trader RUN_IN_BACKGROUND allow || true
  A dumpsys deviceidle disable || true

  # --- 極致：logd 縮到 64K (persist 落種子) ---
  A setprop persist.logd.size 64K || true
  A logcat -G 64K || true

  echo "✅ STEP4 完成。確認富途仍正常開到、停留自選頁，再跑 step5"
}

# ════════════════════════════════════════════
# STEP 5: 深度脫水 (製種前最後清理)
# ════════════════════════════════════════════
step5() {
  adb connect "$DEV" >/dev/null
  A am force-stop cn.futu.trader
  sleep 2

  # 富途 webview / 快取 (最肥，必清；databases 及 shared_prefs 絕不掂)
  A 'rm -rf /data/data/cn.futu.trader/app_webview/Default/Cache/* \
            /data/data/cn.futu.trader/app_webview/Default/Code\ Cache/* \
            /data/data/cn.futu.trader/app_webview/Default/GPUCache/* \
            /data/data/cn.futu.trader/cache/* \
            /data/data/cn.futu.trader/code_cache/* \
            /data/data/cn.futu.trader/app_textures/* \
            /data/data/cn.futu.trader/files/image_cache/*' 2>/dev/null

  # 極致：外部儲存快取都清埋 (好多人漏咗呢度)
  A 'rm -rf /storage/emulated/0/Android/data/cn.futu.trader/cache/* \
            /storage/emulated/0/Download/* \
            /storage/emulated/0/Pictures/*' 2>/dev/null

  # 系統日誌/崩潰/統計 (dalvik-cache 千祈唔好刪 — 嗰啲係 AOT 成果)
  A 'rm -rf /data/system/usagestats/* /data/system/dropbox/* \
            /data/log/* /data/anr/* /data/tombstones/* \
            /data/misc/logd/* /data/cache/* /data/backup/* \
            /data/local/tmp/*' 2>/dev/null

  A pm trim-caches 128G || true

  # 極致：docker stop 而唔係 rm -f → 俾 Android 正常落盤，種子最一致
  docker stop -t 20 "$CN"
  docker rm "$CN"
  echo "✅ STEP5 脫水完成，容器已乾淨停機。跑 step6 固化種子 示例: bash setup.sh step6 hk"
}

# ════════════════════════════════════════════
# STEP 6: 固化種子 (支援 hk / us)
# ════════════════════════════════════════════
step6() {
  local target seed_name
  case "${1:-}" in        # ← 改這裡，2 改 1
    hk|HK|1hk)
      target="$SEED_HK"
      seed_name="HK"
      ;;
    us|US|1us)
      target="$SEED_US"
      seed_name="US"
      ;;
    *)
      echo "❌ 用法錯誤"
      echo "用法: bash setup.sh step6 <hk|us>"
      exit 1
      ;;
  esac

  rm -rf "$target"
  mkdir -p "$target"
  cp -a "$SEED_BUILD"/. "$target"/

  echo "✅ 已固化 ${seed_name} 種子 → $target"
  du -sh "$target"
  find "$target" | wc -l
  echo ""
  echo "提示：做完一個種子後，要做另一個必須重新從 step2 開始跑。"
}
# ════════════════════════════════════════════
# STEP 7: systemd 開機自跑主程式
# ════════════════════════════════════════════
step7() {
  [ -f /root/kline_probe.py ] || { echo "❌ 先放 kline_probe.py 落 /root/"; exit 1; }
  cat > /etc/systemd/system/kline-probe.service <<'EOF'
[Unit]
Description=Futu Kline Probe
After=docker.service network-online.target
Requires=docker.service

[Service]
Type=simple
WorkingDirectory=/root
ExecStart=/usr/bin/python3 /root/kline_probe.py AUTO
Restart=always
RestartSec=10
Nice=-5
OOMScoreAdjust=-500
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
  systemctl daemon-reload
  systemctl enable --now kline-probe
  echo "✅ 全部完成！journalctl -u kline-probe -f 睇 log"
}

case "${1:-}" in
  step1|step2|step3|step4|step5|step7) "$1" ;;
  step6) step6 "${2:-}" ;;                        # ← 加這行，單獨處理
  *) echo "用法: bash setup.sh <step1..step7> [hk|us]"; exit 1 ;;
esac
