#!/bin/bash
# 设定本机设备号（= ERP 门店编号）。全新装机（aadensetup.sh）和镜像克隆来的机器改号都走这一个入口：
#   aaden-cli set-device-id <号>
#
# 1. 先查云端：这个号是 ERP 里哪家店、是不是已经有收银机在用（checkDeviceId.sh），拦住撞号
# 2. 写配置：没有 config.ini 时让后端 AutoSetup.php 按默认配置生成；已有时只改 [Device] 段和 config.json，其余配置原样保留
# 3. 主机名 aadenXXXX，/etc/hosts 里只留一行（以前每次装机都往里追加一行）
# 4. ngrok 隧道 ikXXXX / SSH 端口 10000+号，重启隧道；第一次装时下载 ngrok 并装成服务
# 5. 马上上报一次，云端 ERP 门店列表的「机器」列随即显示就绪
#
# 退出码：0 成功；1 号不对或取消；2 写配置失败
export PATH="/usr/local/bin:$PATH"
DIR="$(cd "$(dirname "$0")" && pwd)"
CONFIG_DIR=/var/www/html/Resource/config
CONFIG_INI=$CONFIG_DIR/config.ini
CONFIG_JSON=$CONFIG_DIR/config.json

# 和 aaden-cli 其他地方一样用 -S 从 stdin 喂密码（aaden 不一定有免密 sudo）。
# 注意：不能再往 sudoS 的命令里用管道喂内容——stdin 已经被密码占了，内容一律先写临时文件再 sudoS cp。
sudoS() { echo "Innerken322." | sudo -S -p '' "$@"; }
# 先把 sudo 凭据缓存上：后面调的 aaden-cli 子命令（fix-ngrok 等）里还有裸 sudo
sudoS -v 2>/dev/null

NEW_ID="$1"
if [ -z "$NEW_ID" ]; then
  read -r -p '设备号: ' NEW_ID
fi
NEW_ID=$(printf '%s' "$NEW_ID" | tr -d '[:space:]')
if ! [[ "$NEW_ID" =~ ^[0-9]+$ ]]; then
  echo "设备号必须是数字：'$NEW_ID'"
  exit 1
fi
NEW_ID=$((10#$NEW_ID)) # 去掉前导零，和云端、ERP 编号一致
source "$DIR/farmRange.sh" && farm_range_guard "$NEW_ID" || exit 1
NAME="IK$(printf '%04d' "$NEW_ID")"
HOST="aaden$(printf '%04d' "$NEW_ID")" # 和 ngrok 的 ik 号一样补到 4 位：aaden0001、aaden1958

ini_device_id() {
  [ -f "$CONFIG_INI" ] || return
  awk -F= '/^\[/ { s = $0 } s ~ /^\[Device\]/ && $1 ~ /^[ \t]*DeviceId[ \t]*$/ { gsub(/[ \t"\r]/, "", $2); print $2; exit }' "$CONFIG_INI"
}
OLD_ID=$(ini_device_id)

if [ "$OLD_ID" = "$NEW_ID" ]; then
  echo "本机已经是设备号 $NEW_ID，只重新应用主机名、ngrok 并上报"
else
  [ -n "$OLD_ID" ] && echo "本机原设备号：$OLD_ID → 改成 $NEW_ID"
  bash "$DIR/checkDeviceId.sh" "$NEW_ID" || exit 1

  # 已经启用 TSE 的机器改号：TSE 记录会挂到新号上。正常流程是先改号，再「清空数据、启用 TSE」
  if [ -n "$OLD_ID" ] && grep -qiE '^[ \t]*TseEnabled[ \t]*=[ \t]*"?(true|1)"?[ \t]*$' "$CONFIG_INI"; then
    echo "⚠ 本机已经启用 TSE（原设备号 $OLD_ID）。正常应该先改号，再清空数据、启用 TSE。"
    answer=""
    { exec 3</dev/tty; } 2>/dev/null && read -r -p "确定要改号请输入 yes：" answer <&3 2>/dev/tty
    [ "$answer" = "yes" ] || { echo "已取消。"; exit 1; }
  fi
fi

# ---------------------------------------------------------------- 配置
if [ ! -f "$CONFIG_INI" ]; then
  # 全新装机：后端按默认配置生成 config.ini / config.json（以 www-data 写，权限和以前一样）
  curl -fsS -m 30 "http://localhost/PHP/AutoSetup.php?DeviceId=$NEW_ID" >/dev/null \
    || { echo "调用 AutoSetup.php 失败（Apache/PHP 还没起来？）"; exit 2; }
elif [ "$OLD_ID" != "$NEW_ID" ]; then
  TMP=$(mktemp)
  awk -v id="$NEW_ID" -v name="$NAME" '
    function fill() {
      if (!doneId) print "DeviceId = \"" id "\""
      if (!doneName) print "DeviceName = \"" name "\""
    }
    /^\[/ {
      if (inDev) fill()
      inDev = ($0 ~ /^\[Device\][ \t\r]*$/)
      if (inDev) seen = 1
      print; next
    }
    inDev && /^[ \t]*DeviceId[ \t]*=/ { print "DeviceId = \"" id "\""; doneId = 1; next }
    inDev && /^[ \t]*DeviceName[ \t]*=/ { print "DeviceName = \"" name "\""; doneName = 1; next }
    { print }
    END {
      if (inDev) fill()
      if (!seen) { print "[Device]"; print "DeviceId = \"" id "\""; print "DeviceName = \"" name "\"" }
    }' "$CONFIG_INI" >"$TMP"
  # cp 覆盖内容、保留原文件的属主和权限
  sudoS cp "$TMP" "$CONFIG_INI" || { rm -f "$TMP"; echo "写 $CONFIG_INI 失败"; exit 2; }
  printf '{"DeviceId":"%s","DeviceName":"%s"}' "$NEW_ID" "$NAME" >"$TMP"
  sudoS cp "$TMP" "$CONFIG_JSON"
  rm -f "$TMP"
fi
if [ "$(ini_device_id)" != "$NEW_ID" ]; then
  echo "写完配置后读到的设备号是「$(ini_device_id)」，不是 $NEW_ID"
  exit 2
fi
echo "配置已写入：$CONFIG_INI → DeviceId = $NEW_ID"

# ---------------------------------------------------------------- 主机名
# 先写 /etc/hosts 再改主机名，否则改完的那一刻 sudo 会报 unable to resolve host
TMP=$(mktemp)
grep -vE '[[:space:]]aaden[0-9]+[[:space:]]*$' /etc/hosts >"$TMP"
echo "127.0.1.1 $HOST" >>"$TMP"
sudoS cp "$TMP" /etc/hosts
rm -f "$TMP"
# WSL 没有 systemd 时 hostnamectl 不可用，退回直接写 /etc/hostname
if ! sudoS hostnamectl set-hostname "$HOST" 2>/dev/null; then
  TMP=$(mktemp)
  echo "$HOST" >"$TMP"
  sudoS cp "$TMP" /etc/hostname && sudoS hostname "$HOST"
  rm -f "$TMP"
fi
echo "主机名：$HOST"

# ---------------------------------------------------------------- ngrok
aaden-cli update-ngrok-config "$NEW_ID" >/dev/null
if [ -f /etc/systemd/system/aaden-ngrok-v3.service ] && [ -x /etc/aaden/ngrok ]; then
  sudoS systemctl restart aaden-ngrok-v3 2>/dev/null || sudoS service aaden-ngrok-v3 restart
else
  aaden-cli fix-ngrok # 第一次：下载 ngrok、装 systemd 服务
fi
echo "ngrok：ik$(printf '%04d' "$NEW_ID").ngrok.aaden.io，SSH 端口 $((10000 + NEW_ID))"

# ---------------------------------------------------------------- 上报
# do-log 连不上云端时退出码也是 0，所以回头问云端确认收到了没有
aaden-cli do-log >/dev/null 2>&1
MINUTES=$(curl -fsS -m 15 "${AADEN_CLOUD_URL:-https://cloud-v2.aaden.io}/deviceLog/install-check/$NEW_ID" 2>/dev/null \
  | python3 -c 'import json, sys; m = json.load(sys.stdin).get("lastReportMinutesAgo"); print("" if m is None else m)' 2>/dev/null)
if [ -n "$MINUTES" ] && [ "$MINUTES" -le 5 ]; then
  echo "云端已收到本机上报，ERP 门店列表的「机器」列显示就绪"
else
  echo "⚠ 云端还没收到本机上报（网络不通？）。联网后每 5 分钟会自动上报一次"
fi
exit 0
