#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════════════════
# first-import.sh — 新环境数据首灌(compose 模式)
#   seed(Host 配置) → cold-import(存量) → recompute(画像 + 计划)
#
# 前置:deploy/deploy-prod.sh 已跑过(容器在跑、migration 已 deploy、.env 已配全)。
# 增量不用管:pac-service 进程内调度器会按各 manifest 的 incremental_cron 自动注册。
#
# 用法:
#   bash deploy/first-import.sh                     # host=jvs-dw 全量首灌
#   HOST=jvs-dw DRY_RUN=1 bash deploy/first-import.sh   # 只 dry-run 存量(不写库,验翻译)
#   HOST=jvs-dw ALLOW_PARTIAL=1 bash deploy/first-import.sh  # 明知 manifest 有 LIMIT 仍继续(试灌)
# ═══════════════════════════════════════════════════════════════════════
set -euo pipefail

ROOT="${PAC_REPO_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
cd "$ROOT"
HOST="${HOST:-jvs-dw}"
COMPOSE=(docker compose -f docker-compose.prod.yml)
EX() { "${COMPOSE[@]}" exec -T pac-service "$@"; }

echo "▶ 数据首灌  host=$HOST  dry_run=${DRY_RUN:-0}"

# 0) 前置:pac-service 在跑
if ! "${COMPOSE[@]}" ps pac-service 2>/dev/null | grep -qiE 'up|running'; then
  echo "✗ pac-service 没在跑。先 bash deploy/deploy-prod.sh。" >&2
  exit 1
fi

# 1) manifest 存在 + 全量提醒(cohort 试跑限量没去掉会只灌部分患者)
if ! EX sh -c "test -f ./data/$HOST/manifest.yaml"; then
  echo "✗ 容器内无 data/$HOST/manifest.yaml(镜像里没这个 host 的配置)。" >&2
  exit 1
fi
if EX sh -c "grep -nqiE 'limit|offset' ./data/$HOST/manifest.yaml"; then
  echo "⚠ manifest 里发现 LIMIT/OFFSET —— 可能是 cohort 试跑限量,全量首灌前应去掉:"
  EX sh -c "grep -niE 'limit|offset' ./data/$HOST/manifest.yaml" || true
  if [[ "${ALLOW_PARTIAL:-0}" != "1" && "${DRY_RUN:-0}" != "1" ]]; then
    echo "✗ 已中止,防止只灌部分数据。确认要限量试灌请加 ALLOW_PARTIAL=1;或去掉限量后重跑。" >&2
    exit 1
  fi
fi

# 2) seed —— Host 行(appId/secret、orgAliases、clinicNames)。upsert,可重复跑。
echo "▶ [1/4] seed Host 配置(upsert)…"
EX pnpm prisma:seed

# 3) 存量 cold-import
if [[ "${DRY_RUN:-0}" == "1" ]]; then
  echo "▶ [2/4] cold-import --dry-run(只读 + 翻译预览,不写库)…"
  EX node --max-old-space-size=8192 dist/cli/cold-import.cli.js --dir="./data/$HOST" --dry-run
  echo "✓ dry-run 完成。去掉 DRY_RUN 再跑真灌。"
  exit 0
fi
echo "▶ [2/4] cold-import 全量(耗时随数据量;jvs-dw 13 万患者约数十分钟)…"
EX node --max-old-space-size=8192 dist/cli/cold-import.cli.js --dir="./data/$HOST"

# 4) 重算画像 + 计划(存量灌完必须补,否则患者进不了召回池)
echo "▶ [3/4] recompute-persona…"
EX node --max-old-space-size=8192 dist/cli/recompute-persona.cli.js --host="$HOST"
echo "▶ [4/4] recompute-plans…"
EX node --max-old-space-size=8192 dist/cli/recompute-plans.cli.js --host="$HOST"

echo
echo "✓ 首灌完成。增量无需手动 —— 进程内调度器已按 manifest 注册 cron。"
echo "  验证增量已注册:  ${COMPOSE[*]} logs pac-service | grep '注册 host=$HOST'"
echo "  验证数据在库:    次日看 PAC哨兵 日报,或 /admin/queues"
