#!/bin/sh
set -eu
LOG="${TMPDIR:-/tmp}/xlight-upgrade.log"
ACTIVATION_SUBMITTED=0
fail() {
  printf "\nXLight 固件升级未完成。\n原因：%s\n" "$1"
  if [ "$ACTIVATION_SUBMITTED" -eq 1 ]; then
    echo "激活码状态：已经提交，请联系售后后再重试。"
  else
    echo "激活码状态：尚未提交，可以继续使用。"
  fi
  printf "技术日志：%s\n" "$LOG"
  exit 1
}
SERVER="https://light.chuncui.icu/activation"
PORT="${1:-}"

if [ -z "$PORT" ]; then
  PORT=$(ls /dev/cu.usbmodem* /dev/ttyACM* /dev/ttyUSB* 2>/dev/null | head -n 1 || true)
fi
[ -n "$PORT" ] || { echo "未找到 XLight，请使用数据线连接设备后重试。"; exit 1; }
command -v python3 >/dev/null || { echo "需要 Python 3。"; exit 1; }
command -v curl >/dev/null || { echo "需要 curl。"; exit 1; }

while :; do
  printf "请输入激活码，格式 XL-XXXXX-XXXXX-XXXXX（获取方式：orz_8888888）: "
  stty -echo
  IFS= read -r CODE
  stty echo
  printf "\n"
  CODE=$(printf "%s" "$CODE" | tr '[:lower:]' '[:upper:]')
  case "$CODE" in
    XL-?????-?????-?????) break ;;
    *) echo "激活码格式错误，请重新输入。" ;;
  esac
done

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"; stty echo 2>/dev/null || true' EXIT
python3 -m venv "$TMP/venv"
TOOL_PYTHON="$TMP/venv/bin/python"
echo "[1/4] 正在通过国内镜像准备升级工具..."
("$TOOL_PYTHON" -m pip install --disable-pip-version-check --timeout 120 --retries 5 \
  --index-url https://pypi.tuna.tsinghua.edu.cn/simple "esptool==5.3.0" || {
  echo "国内镜像不可用，正在尝试官方源..."
  "$TOOL_PYTHON" -m pip install --disable-pip-version-check --timeout 120 --retries 5 \
    "esptool==5.3.0"
}) >>"$LOG" 2>&1 || fail "升级工具下载失败，请检查网络。"

printf "[2/4] 正在验证激活码...\n"

BODY=$(printf '{"code":"%s","device_mac":"%s"}' "$CODE" "$PORT")
RESPONSE=$(curl -fsS -X POST "$SERVER/activate" -H "Content-Type: application/json" -d "$BODY") || {
  fail "激活码无效、已使用，或网络连接失败。"
}
ACTIVATION_SUBMITTED=1
URL=$(printf "%s" "$RESPONSE" | python3 -c 'import json,sys; print(json.load(sys.stdin)["download_url"])')
echo "[3/4] 正在下载固件..."
curl -fsS "$SERVER$URL" -o "$TMP/xlight-firmware.bin" || {
  echo "固件下载失败，请重新获取激活码。"; exit 1;
}
echo "[4/4] 正在写入固件..."
"$TOOL_PYTHON" -m esptool --chip esp32c3 --port "$PORT" --baud 921600 write-flash 0x0 "$TMP/xlight-firmware.bin" >>"$LOG" 2>&1 || fail "固件写入失败，请保持数据线连接。"
echo "XLight 固件升级成功，请等待设备自动重启。"
