#!/system/bin/sh
# LOCAmcp 抓包助手 v3（2026-09-28）
#   capture start [端口]        设全局代理（默认 127.0.0.1:8899，也可 192.168.1.5:8888 用电脑抓 ✓）
#   capture stop                收工（清代理 + 杀残留 ✓）
#   capture fix                 紧急恢复（网络不通就跑它 ✓ 等于原来那个恢复脚本 ✓ 但更彻底 ✓）
#   capture status              看状态
#   capture ca install|remove|status    HTTPS 抓包证书（可选 ✓）
D=/data/adb/locamcp-mcp
BIN=$D/bin
STATE=$D/capture.state
WPID=$D/capture.watchdog.pid
LOG=$D/logs/capture.log
mkdir -p "$D/logs"
CURL=""
for c in /data/data/com.termux/files/usr/bin/curl /system/bin/curl /product/bin/curl; do
  [ -x "$c" ] && CURL="$c" && break
done
say(){ echo "[$(date '+%m-%d %H:%M:%S')] $1" >> "$LOG"; }

# ★ 写设置统一走这个：先用 shell 用户（实测最稳 ✓），失败再用 root ✓，写完读回校验 ✓
# ★ 写设置：间隔 ≥2 秒（系统有写入节流 ✗ 连续快写会被拒 ✓），失败就退避重试 ✓
wset(){
  settings "$@" >/dev/null 2>&1
  sleep 1.5
}
clear_proxy(){
  # 第一步只做最要紧的那一下（清掉代理 = 网络立刻恢复 ✓）
  for r in 1 2 3 4; do
    wset put global http_proxy :0
    P=$(settings get global http_proxy 2>/dev/null)
    case "$P" in null|:0|''|'null') break;; esac
    say "  清代理第 $r 次没成功（剩 $P ✗）等 $((r*2)) 秒再来…"
    sleep $((r*2))
  done
  # 再清那几个历史遗留键（一次一个 ✓ 慢一点 ✓）
  wset delete global http_proxy
  wset delete global global_http_proxy_host
  wset delete global global_http_proxy_port
  wset delete global global_http_proxy_exclusion_list
  wset delete global global_proxy_pac_url
  P=$(settings get global http_proxy 2>/dev/null)
  case "$P" in null|:0|''|'null') say "  ✓ 代理已清干净（$P）"; return 0;; esac
  say "  ✗ 还没清掉（剩 $P）→ 再跑一次 capture fix 或重启手机 ✓"
  return 1
}
killproxy(){
  for port in 8899 8888 8080 8081; do
    for pid in $(ss -ltnp 2>/dev/null | grep ":$port " | grep -oE 'pid=[0-9]+' | cut -d= -f2 | sort -u); do
      kill -9 "$pid" 2>/dev/null && say "  杀掉占用 $port 的进程 $pid"
    done
  done
}
killwd(){
  [ -f "$WPID" ] && kill -9 "$(cat $WPID)" 2>/dev/null
  for p in $(ps -ef 2>/dev/null | grep 'capture-wd-loop' | grep -v grep | awk '{print $2}'); do kill -9 "$p" 2>/dev/null; done
  rm -f "$WPID"
}
do_fix(){
  say "→ 恢复网络…"
  clear_proxy
  killproxy
  killwd
  rm -f "$STATE"
  if [ -n "$CURL" ]; then
    $CURL -s -m 6 -o /dev/null https://www.baidu.com 2>/dev/null && say "  ✓ 联网正常" || say "  ⚠ 还是连不上 → 再跑一次 capture fix，或重启手机 ✓"
  fi
  P=$(settings get global http_proxy 2>/dev/null)
  echo "✓ 已收工：http_proxy = $P"
  if [ -n "$CURL" ]; then
    $CURL -s -m 6 -o /dev/null https://www.baidu.com 2>/dev/null && echo "✓ 联网正常" || echo "⚠ 连不上 → 再跑一次 capture fix，或重启手机"
  fi
}

case "$1" in
  start)
    T="$2"; [ -z "$T" ] && T="127.0.0.1:8899"
    case "$T" in *:*) ;; *) T="127.0.0.1:$T";; esac
    killwd
    ok=0
    for i in 1 2 3 4; do
      wset put global http_proxy "$T"
      [ "$(settings get global http_proxy 2>/dev/null)" = "$T" ] && ok=1 && break
      say "  设代理第 $i 次没成功，重试…"
      sleep 1.5
    done
    if [ "$ok" != 1 ]; then echo "✗ 代理设不上（系统设置服务忙 ✗）过一会儿再试 ✓"; rm -f "$STATE"; exit 1; fi
    echo "$T" > "$STATE"
    say "→ 已设代理 $T"
    nohup sh -c "
      FAIL=0
      while [ -f $STATE ]; do
        T=\$(cat $STATE 2>/dev/null); H=\${T%%:*}; P=\${T##*:}
        OK=0
        [ -n '$CURL' ] && \$CURL -s -m 3 -o /dev/null telnet://\$H:\$P 2>/dev/null && OK=1
        [ \$OK = 0 ] && command -v nc >/dev/null 2>&1 && nc -z -w 3 \$H \$P 2>/dev/null && OK=1
        if [ \$OK = 1 ]; then FAIL=0; else FAIL=\$((FAIL+1)); fi
        if [ \$FAIL -ge 2 ]; then
          echo \"[\$(date '+%m-%d %H:%M:%S')] ⚠ 代理 \$T 连不上了 → 自动清掉恢复网络 ✓\" >> $LOG
          sh $BIN/capture fix >> $LOG 2>&1
          exit 0
        fi
        sleep 20
      done
    " capture-wd-loop >/dev/null 2>&1 &
    echo $! > "$WPID"
    echo "✓ 代理已设: $T"
    echo "✓ 守护已启动（代理一死自动清掉 ✓ 不会再出现上次那种"AI 用不了 + 没网"✗）"
    echo "  收工:  capture stop      紧急:  capture fix"
    ;;
  stop|fix) do_fix ;;
  status)
    echo "  http_proxy = $(settings get global http_proxy 2>/dev/null)"
    echo "  端口 8899/8888/8080 监听 = $(ss -ltn 2>/dev/null | grep -cE ':(8899|8888|8080) ')"
    [ -f "$STATE" ] && echo "  抓包中: $(cat $STATE)（守护 pid=$(cat $WPID 2>/dev/null)）" || echo "  未在抓包 ✓"
    [ -n "$CURL" ] && { $CURL -s -m 6 -o /dev/null https://www.baidu.com 2>/dev/null && echo "  联网: ✓" || echo "  联网: ✗（跑 capture fix ✓）"; }
    tail -4 "$LOG" 2>/dev/null | sed 's/^/  /'
    ;;
  ca)
    T=/data/adb/modules/locamcp.android/bin/locamcp
    if [ -x "$T" ]; then "$T" mitm_ca "${2:-status}"; else echo "✗ 用 App 里的 mitm_ca 工具也行 ✓"; fi
    ;;
  *) sed -n '3,7p' "$0" | sed 's/^# \?//' ;;
esac
