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

STORE_BASE="${STORE_BASE:-http://192.211.45.168}"
STORE_HOST="${STORE_HOST:-127.0.0.1}"
AI_BASE="${AI_BASE:-${STORE_BASE}/aizhct/index.php}"
PC_ACCOUNT="${PC_ACCOUNT:-admin}"
PC_PASSWORD="${PC_PASSWORD:-Cpt@1234}"
MINIAPP_MOBILE="${MINIAPP_MOBILE:-13907131458}"
MINIAPP_PASSWORD="${MINIAPP_PASSWORD:-cptyy@123}"
ENTERPRISE_NO="${ENTERPRISE_NO:-10051}"
OB_HOST="${OB_HOST:-192.211.45.170}"
OB_PORT="${OB_PORT:-2883}"
OB_USER="${OB_USER:-zhct_user@zhct#city_subcenter_ob_primary}"
OB_PASSWORD="${OB_PASSWORD:-Zhct_OB_20260615}"
ZHCT_DB="${ZHCT_DB:-zhct_csfzx}"
AIZHCT_DB="${AIZHCT_DB:-aizhct_csfzx}"
BAIDU_FACE_HEALTH="${BAIDU_FACE_HEALTH:-http://192.211.45.173:18080/health}"

PHP_BIN="${PHP_BIN:-php}"
if [ "$PHP_BIN" = "php" ] && command -v /usr/local/php7.4/bin/php >/dev/null 2>&1; then
  PHP_BIN="/usr/local/php7.4/bin/php"
fi

log() {
  printf '\n[%s] %s\n' "$(date '+%F %T')" "$*"
}

pass() {
  printf 'PASS: %s\n' "$*"
}

warn() {
  printf 'WARN: %s\n' "$*" >&2
}

fail() {
  printf 'FAIL: %s\n' "$*" >&2
  exit 1
}

json_get() {
  local expr="$1"
  "$PHP_BIN" -r '$j=json_decode(stream_get_contents(STDIN),true); $v='"$expr"'; if (is_array($v)) echo json_encode($v, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); else echo $v ?? "";'
}

pc_login() {
  local login token
  login=$(curl -sS --max-time 20 -X POST "${STORE_BASE}/p/login/login" \
    -H "Host: ${STORE_HOST}" \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode "account=${PC_ACCOUNT}" \
    --data-urlencode "pwd=${PC_PASSWORD}")
  token=$(printf '%s' "$login" | json_get '$j["data"]["_token"] ?? ""')
  [ -n "$token" ] || {
    printf '%s\n' "$login" | cut -c1-500
    fail "PC 登录失败"
  }
  PC_COOKIE_TOKEN=$(TOKEN="$token" "$PHP_BIN" -r 'echo rawurlencode(getenv("TOKEN"));')
  export PC_COOKIE_TOKEN
  pass "PC 登录成功 TOKEN_LEN=${#token}"
}

miniapp_login() {
  local login token
  login=$(curl -sS --max-time 20 -X POST "${AI_BASE}?s=/api/passport/loginAccount" \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode "form[account]=${MINIAPP_MOBILE}" \
    --data-urlencode "form[password]=${MINIAPP_PASSWORD}" \
    --data-urlencode "form[enterprise_no]=${ENTERPRISE_NO}")
  token=$(printf '%s' "$login" | json_get '$j["data"]["token"] ?? ""')
  [ -n "$token" ] || {
    printf '%s\n' "$login" | cut -c1-500
    fail "小程序登录失败"
  }
  ACCESS_TOKEN="$token"
  export ACCESS_TOKEN
  pass "小程序登录成功 ACCESS_TOKEN_LEN=${#token}"
}

ai_headers() {
  printf -- "-H\nAccess-Token: %s\n-H\nplatform: MP-WEIXIN\n-H\nenv-version: release\n-H\nversion: 1.0.0\n" "$ACCESS_TOKEN"
}

obclient_available() {
  command -v obclient >/dev/null 2>&1
}

ob_query() {
  local db="$1"
  local sql="$2"
  if ! obclient_available; then
    warn "当前机器没有 obclient，跳过 SQL：$sql"
    return 0
  fi
  if ! obclient -h"${OB_HOST}" -P"${OB_PORT}" -u"${OB_USER}" -p"${OB_PASSWORD}" -D"${db}" -e "$sql"; then
    warn "SQL 查询失败，继续后续接口验证：$sql"
    return 0
  fi
}

ob_query_raw() {
  local db="$1"
  local sql="$2"
  if ! obclient_available; then
    return 0
  fi
  obclient -h"${OB_HOST}" -P"${OB_PORT}" -u"${OB_USER}" -p"${OB_PASSWORD}" -D"${db}" -Nse "$sql" || true
}
