# ═══════════════════════════════════════════════════════════════════════
# PAC Service — Environment Variables(对照模板)
#
# 三套环境:
#   local       本地开发(你 Mac + docker compose)
#   staging     试部署 / 演示(云服务器,客服试用)
#   production  正式生产(云服务器,真客服上线)
#
# 部署:
#   - 复制本文件 → .env(本地)/ /opt/pac/.env(服务器)
#   - 服务器侧 chmod 600 .env
#   - .env 永远不进 git(.gitignore 已守)
#
# 上线前必检:JWT_SECRET / JWT_REFRESH_SECRET / DEEPSEEK_API_KEY / DW_CLICKHOUSE_PASSWORD
# 必须 per-env 不同(staging / prod 各一份强随机)
# ═══════════════════════════════════════════════════════════════════════

# ─── 基础 ────────────────────────────────────────────────────────────
#   local:       development
#   staging:     staging
#   production:  production           ⚠️ 必须设 production,关掉一些开发兜底
NODE_ENV=development

PORT=3101

#   local: debug | staging+prod: info
LOG_LEVEL=info


# ─── Postgres 初始化(仅 compose 模式用 — postgres 容器启动时读这三个)──
#   systemd 模式可忽略(你自己起 postgres 时指定)
POSTGRES_USER=pac
POSTGRES_PASSWORD=pac-change-me-in-prod
POSTGRES_DB=pac


# ─── 数据库 / 缓存 ────────────────────────────────────────────────────
# DATABASE_URL / REDIS_URL 的 host 部分按部署模式不同:
#   systemd 模式:  host=localhost   port=5532/6479    (走宿主端口映射)
#   compose 模式:  host=postgres/redis  port=5432/6379  (走 docker 内部网络)
#                 → compose 会在 environment: 段自动覆盖此处的 URL,这里写 localhost 即可
#
#   staging:     postgresql://pac:<staging-pwd>@<staging-pg-host>:5532/pac?schema=public
#   production:  postgresql://pac:<prod-pwd>@<prod-pg-host>:5532/pac?schema=public
DATABASE_URL=postgresql://pac:pac@localhost:5532/pac?schema=public

#   staging+prod: redis://<host>:6479  (BullMQ 队列用,丢了会丢未消费的 plan-asset-generate 任务)
REDIS_URL=redis://localhost:6479


# ─── JWT(per-env 必须不同强随机)────────────────────────────────────
# 生成命令:openssl rand -hex 32
# ⚠️ staging / production 必须分别生成 — 同一份 secret 跨环境会让 staging token 在 prod 通过验证
JWT_SECRET=replace-with-strong-random-secret-min-32-chars
JWT_REFRESH_SECRET=replace-with-another-strong-secret-min-32-chars
JWT_EXPIRES_IN=2h
JWT_REFRESH_EXPIRES_IN=7d


# ─── AI(DeepSeek 国内直连)─────────────────────────────────────────
# Key 从 https://platform.deepseek.com/api_keys 取
#   local + staging: 团队共享 key(开发额度)
#   production:      独立 prod key(独立配额 / 账单)
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com

# 默认主力模型
#   local:      deepseek-v4-flash  (省钱开发)
#   staging:    deepseek-v4-flash
#   production: deepseek-v4-pro    (质量优先)
AI_DEFAULT_MODEL=deepseek-v4-flash

AI_REQUEST_TIMEOUT_SEC=60

# ── Qwen(通义千问 / DashScope)—— 话术生成的可选 provider(部分调用路由到 qwen)──
# Key 从 https://bailian.console.aliyun.com/ 取(DashScope);QWEN_API_KEY 不设则回退 DASHSCOPE_API_KEY。
#   生产已在用 → 建议配。model/base_url 留空走代码默认(qwen3.7-max / dashscope compatible-mode)。
QWEN_API_KEY=
# QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
# QWEN_DEFAULT_MODEL=qwen3.7-max

# ── 实时坐席辅助教练(可选功能;不用语音实时教练可留空)──
# DashScope 实时(qwen-omni)+ Gemini Live 二选一/互备。
DASHSCOPE_API_KEY=
# QWEN_OMNI_MODEL=qwen3-omni-flash-realtime
GEMINI_API_KEY=
# GEMINI_DEFAULT_MODEL=gemini-3.5-flash
# GEMINI_LIVE_MODEL=gemini-3.1-flash-live-preview

# 价格表(¥/M tokens)— 调价时改这里重启;不配走默认
# AI_PRICE_TABLE_JSON={"deepseek-v4-pro":{"inHit":0.5,"inMiss":3.6,"out":25},"deepseek-v4-flash":{"inHit":0.07,"inMiss":0.5,"out":2}}


# ─── CORS / iframe ───────────────────────────────────────────────────
#   local:       http://localhost:3100
#   staging:     https://pac-staging.<your-domain>
#   production:  https://pac.<your-domain>  (多个用逗号)
CORS_ORIGINS=http://localhost:3100

# iframe 一次性 code TTL(默认 60s)
EXCHANGE_CODE_TTL_SECONDS=60


# ─── 远程 DW(瑞尔 jvs-dw)ClickHouse 直连 ──────────────────────────
# manifest.yaml 里 sql_source.connection 是 dev 默认(localhost:8123);
# 这几个 env 覆盖之,无需改 manifest
#
#   local:       不设 → 走 manifest 默认本地 docker CH
#   staging+prod: 必须设 → 远程瑞尔 ADS
#
# 生产示例:
#   DW_CLICKHOUSE_URL=http://cc-2zen8w29e49076o83.public.clickhouse.ads.aliyuncs.com:8123
#   DW_CLICKHOUSE_DATABASE=dw_group
#   DW_CLICKHOUSE_USERNAME=jvs_pac
#   DW_CLICKHOUSE_PASSWORD=<vendor 给的密码>
DW_CLICKHOUSE_URL=
DW_CLICKHOUSE_DATABASE=
DW_CLICKHOUSE_USERNAME=
DW_CLICKHOUSE_PASSWORD=


# ─── 数据接入 cron / 监控 ────────────────────────────────────────────
# 不设 → 该 cron 不跑(本地默认不跑,避免开发时自动消耗 DW 流量)
# 设了 → 走 standard cron 5 字段(分 时 日 月 周)
#
#   local:      不设(留空)
#   staging:    30 3 * * *       (03:30 错峰,避免跟生产撞)
#   production: 30 2 * * *       (02:30 — DW 02:00 完成全量后 30 分钟)
PAC_INCREMENTAL_CRON=

# 自动增量同步的 host:【可选】。
#   默认(留空)→ 自动发现 data/<host>/manifest.yaml 中 `auto_sync: true` 的 host
#     —— 接入新 host 只在其 manifest 置 auto_sync,不必动本 env(防 drift / 漏配静默不同步)。
#   设值(逗号分隔)→ 显式 override,只同步列出的 host(staging 错峰 / 临时只跑某 host 用)。
PAC_INCREMENTAL_HOSTS=

# 增量回看重叠窗(小时)— 容忍 DW 落库迟到(updated_date 旧但落库晚于上次 run_start)。
#   每次增量查询下界 = 游标 − 本值,靠 source_event_id 幂等去重(重扫已摄入行无害)。
#   不设 → 默认 48h。设 0 → 关闭(严格 > 游标,有静默漏拉风险,不建议生产用)。
#   配合「空跑不推进游标」(代码内)双保险:DW 当天刷新晚于 cron 时不会漏数据。
PAC_INCREMENTAL_LOOKBACK_HOURS=

# 其他 cron(同步策略:env 不设 → 不跑)
#   local: 全部不设
#   staging/prod:
#     PAC_LAG_MONITOR_CRON=0 * * * *      (每小时检查 DW 是否滞后)
#     PAC_STALE_SCAN_CRON=0 2 * * *       (凌晨 02:00 扫 stale persona 补算)
#     PAC_SYNC_HOURLY_CRON=               (W5+ host pull 通道接通后启用)
PAC_LAG_MONITOR_CRON=
PAC_STALE_SCAN_CRON=
PAC_SYNC_HOURLY_CRON=

# 数据目录(manifest.yaml 所在位置)
#   local:      默认(代码相对路径)
#   staging:    /opt/pac/apps/pac-service/data
#   production: 同
# PAC_INCREMENTAL_DATA_DIR=/opt/pac/apps/pac-service/data

# DW 数据滞后告警阈值(小时)
#   local:      999  (不告警)
#   staging+prod: 24 warn / 48 error
PAC_LAG_WARN_HOURS=999
PAC_LAG_ERROR_HOURS=999


# ─── 告警通道(W5+ 接钉钉 / 飞书 webhook)──────────────────────────
#   local:      空
#   staging:    测试群 webhook
#   production: 真值班群 webhook
ALERT_WEBHOOK_URL=


# ─── Mock Login(开发 / 试部署快速登录)──────────────────────────────
# 控制 /pac/v1/auth/mock-login endpoint:
#   true   强制启用
#   false  强制禁用
#   (空)  按 NODE_ENV 走(prod 默认禁用,非 prod 默认启用)
#
#   local:      不设(自动启用)
#   staging:    true       (演示 / 客服试用必须开)
#   production: false ⭐    (生产关掉,走 host SSO)
PAC_ENABLE_MOCK_LOGIN=

# ─── 企业微信智能机器人(长连接 / API 模式)──────────────────────────
# 企微后台「创建智能机器人 → API 模式 → 使用长连接」拿 Bot ID + Secret。
# 不填则不启动长连接(其它环境无副作用)。本地填了即自动连。
PAC_WX_AIBOT_BOT_ID=
PAC_WX_AIBOT_SECRET=
# 身份映射(PoC):企微用户统一映射到此 host/tenant 的客服 scope。
#   生产替换为「企微 userid ↔ 真实客服(tenant/clinic/role)」对照。
PAC_WX_AIBOT_HOST=jvs-dw
PAC_WX_AIBOT_TENANT_ID=
# 召回卡深链前缀(主动推送里的链接);线上填真实 web 域名。
PAC_WEB_BASE_URL=http://localhost:3100
# [DEV] 开启「主动推送」演示端点 POST /pac/v1/internal/wx-aibot/push-urgent(=1 放行)。
# ⚠️ 生产请关闭/移除,真实触发走定时扫描或事件驱动,不暴露裸 HTTP 端点。
PAC_WX_AIBOT_DEMO_PUSH=

# ── Sentry(自部署 am.jwsmed.com,project=pac-service)────────────────
# 缺省 → 不初始化 Sentry(本地无需)。测试服务器填 DSN + SENTRY_ENVIRONMENT=test。
SENTRY_DSN=
# 环境区分:test(测试服务器)/ production(生产);缺省回退 NODE_ENV
SENTRY_ENVIRONMENT=
# 性能 tracing 采样率(0~1),默认 0.1;设 0 = 只报错误
SENTRY_TRACES_SAMPLE_RATE=0.1
# release(可选):部署时注入 git SHA
SENTRY_RELEASE=
