#!/bin/bash
# 装机前检查设备号：这个号在 ERP 是哪家店、是不是已经有收银机在用。拦住输错号、用了别家号的「撞号」——
# 同一个号装两台机器，云端的上报、备份、报表、远程连接（ngrok ik 号）会互相覆盖。
#
# 退出码 0 = 继续装；1 = 号不对或装机同事取消。
# 连不上云端只警告、不挡安装（现场网络常常不好）。确实要跳过检查：AADEN_SKIP_DEVICE_CHECK=1
DeviceId="$1"
CLOUD="${AADEN_CLOUD_URL:-https://cloud-v2.aaden.io}"

[ -n "$AADEN_SKIP_DEVICE_CHECK" ] && { echo "跳过设备号检查（AADEN_SKIP_DEVICE_CHECK）"; exit 0; }
if ! [[ "$DeviceId" =~ ^[0-9]+$ ]]; then
  echo "设备号必须是数字：'$DeviceId'"
  exit 1
fi

# 提问走 /dev/tty：脚本的标准输入可能被管道占着。没有终端（自动化装机）时 ask 返回空串
HAVE_TTY=""
{ exec 3</dev/tty; } 2>/dev/null && HAVE_TTY=1
ask() {
  local answer=""
  [ -n "$HAVE_TTY" ] && read -r -p "$1" answer <&3 2>/dev/tty
  echo "$answer"
}

URL="$CLOUD/deviceLog/install-check/$DeviceId"
JSON=$(curl -fsS -m 15 "$URL" 2>/dev/null || wget -qO- -T 15 "$URL" 2>/dev/null)

# 第一行是结论（OK / IN_USE / NO_STORE / ERROR），后面是给装机同事看的说明
REPORT=$(python3 - "$JSON" <<'PY'
import json, sys
try:
    d = json.loads(sys.argv[1])
    store, machine = d.get("store"), d.get("machine")
except Exception:
    print("ERROR")
    sys.exit()

status = {"AwaitingInstallation": "等待安装", "Installed": "已安装", "Closed": "已关停", "StopService": "停止服务"}

def when(v):
    return v[:16].replace("T", " ") if v else "—"

def ago(minutes):
    if minutes is None:
        return "—"
    if minutes < 60:
        return f"{max(minutes, 1)} 分钟前"
    if minutes < 24 * 60:
        return f"{round(minutes / 60)} 小时前"
    return f"{round(minutes / 60 / 24)} 天前"

if not store:
    print("NO_STORE")
    sys.exit()

parts = [p for p in (store.get("displayCode"), store.get("city"), status.get(store.get("status"), store.get("status"))) if p]
store_line = f"ERP 门店「{store.get('name') or '—'}」（{'，'.join(parts)}）"

if machine:
    print("IN_USE")
    print(f"  收银机里的餐厅名：{machine.get('posName') or '—'}")
    print(f"  第一次上报 {when(machine.get('firstReportAt'))}，最近上报 {ago(d.get('lastReportMinutesAgo'))}")
    print(f"  {store_line}")
else:
    print("OK")
    print(f"  {store_line}")
    print("  云端还没收到过这个号的收银机上报")
PY
)
VERDICT=$(echo "$REPORT" | head -n 1)
DETAIL=$(echo "$REPORT" | tail -n +2)

echo ""
echo "#######################################################################"
echo "检查设备号 $DeviceId"
case "$VERDICT" in
  OK)
    echo "$DETAIL"
    # 没有终端可问（自动化装机）时号也没人用，直接继续
    if [ -n "$HAVE_TTY" ]; then
      answer=$(ask "是这家店吗？[y/N] ")
      [[ "$answer" =~ ^[yY] ]] || { echo "已取消。"; exit 1; }
    fi
    ;;
  IN_USE)
    echo "⚠ 这个号已经有收银机在用："
    echo "$DETAIL"
    echo "同一个号装两台机器，云端的上报、备份、报表、远程连接会互相覆盖。"
    echo "只有给这家店换机或重装才应该继续，而且旧机器要先关掉。"
    answer=$(ask "确认继续请再输入一遍设备号（直接回车取消）：")
    [ "$answer" = "$DeviceId" ] || { echo "已取消。"; exit 1; }
    ;;
  NO_STORE)
    echo "✗ ERP 里没有编号 $DeviceId 的门店：先在 ERP 建档，或者检查设备号有没有输错。"
    echo "  确实要装：AADEN_SKIP_DEVICE_CHECK=1 再跑一次"
    exit 1
    ;;
  *)
    echo "⚠ 连不上云端（$CLOUD），没法检查设备号有没有撞号，继续安装。"
    sleep 3
    ;;
esac
echo "#######################################################################"
exit 0
