#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=csfzx-common.sh
source "${SCRIPT_DIR}/csfzx-common.sh"

FACE_IMG="${FACE_IMG:-/tmp/face-test-800.jpg}"
if [ ! -f "$FACE_IMG" ]; then
  FACE_IMG="${FACE_IMG_FALLBACK:-/tmp/pc-dish-img.png}"
fi
[ -f "$FACE_IMG" ] || fail "找不到测试图片，请设置 FACE_IMG=/tmp/xxx.jpg"

log "百度人脸离线 SDK health"
curl -sS --max-time 15 "$BAIDU_FACE_HEALTH" | tee /tmp/csfzx-baidu-face-health.json | cut -c1-600
printf '\n'
if grep -q '"is_auth":true' /tmp/csfzx-baidu-face-health.json && grep -q '"sdk_init_code":0' /tmp/csfzx-baidu-face-health.json; then
  pass "百度人脸离线 SDK 授权和初始化正常"
else
  warn "百度人脸离线 SDK health 未同时出现 is_auth=true 和 sdk_init_code=0"
fi

log "小程序百度人脸上传接口：按手机号上传"
UPLOAD=$(curl -sS --max-time 90 -X POST "${STORE_BASE}/m/Staff/saveFaceByMobile" \
  -H "Host: ${STORE_HOST}" \
  -F "mobile=${MINIAPP_MOBILE}" \
  -F "face_img=@${FACE_IMG}")
printf '%s\n' "$UPLOAD" | cut -c1-1000
printf '\n'
UPLOAD_CODE=$(printf '%s' "$UPLOAD" | json_get '$j["code"] ?? ""')
[ "$UPLOAD_CODE" = "0" ] || fail "小程序百度人脸上传接口失败"
pass "小程序百度人脸上传接口返回 code=0"

log "数据库核验：人员、人脸、硬件图片、MQTT 消息"
STAFF_UUID=$(ob_query_raw "$ZHCT_DB" "SELECT uuid FROM ydy_staff WHERE mobile='${MINIAPP_MOBILE}' AND is_show=1 ORDER BY id DESC LIMIT 1;" 2>/dev/null || true)
if [ -n "${STAFF_UUID:-}" ]; then
  echo "STAFF_UUID=${STAFF_UUID}"
  ob_query "$ZHCT_DB" "SELECT id,uuid,name,mobile,hardware_flag,hardware_time FROM ydy_staff WHERE uuid='${STAFF_UUID}';"
  ob_query "$ZHCT_DB" "SELECT id,staff_uuid,hardware_uuid,CHAR_LENGTH(feature) AS feature_len,CHAR_LENGTH(baidu_face_token) AS token_len,is_del,update_time FROM ydy_staff_face WHERE staff_uuid='${STAFF_UUID}' ORDER BY id DESC LIMIT 3;"
  ob_query "$ZHCT_DB" "SELECT id,staff_uuid,hardware_uuid,is_del,update_time FROM ydy_hardware_img WHERE staff_uuid='${STAFF_UUID}' ORDER BY id DESC LIMIT 3;"
  ob_query "$ZHCT_DB" "SELECT id,type,receive_device_id,staff_uuid,status,publish_time,LEFT(message,220) AS message FROM ydy_mq_message WHERE staff_uuid='${STAFF_UUID}' AND type IN (1,4) ORDER BY id DESC LIMIT 10;"
else
  warn "未能通过 obclient 查到 STAFF_UUID，跳过 DB 证据"
fi

log "在线设备核验：人脸设备和卡片设备"
ob_query "$ZHCT_DB" "SELECT id,code,name,type,hearttime,FROM_UNIXTIME(hearttime) AS heart_time FROM ydy_equipment WHERE del_flag=0 AND mate_flag=1 AND hearttime>=UNIX_TIMESTAMP()-60 ORDER BY hearttime DESC LIMIT 20;"

log "结果说明"
cat <<'TXT'
通过标准：
1. health 出现 sdk_init_code=0、is_auth=true。
2. /m/Staff/saveFaceByMobile 返回 code=0。
3. ydy_staff_face feature_len/token_len 非 0，is_del=0。
4. 若存在在线人脸/刷卡设备，ydy_mq_message 出现 type=1 或 type=4、status=1/2/3 的消息。
   如果没有在线设备，业务上传仍可通过，但 EMQX 设备下发只能记为“待设备在线复验”。
TXT
