/**
 * host org 树解析 + scope 展开(纯函数,无 DI)。
 *
 * 设计 B:JWT 只装通用的 `orgScope`(与对外契约同词汇);**每个请求**在 tenant-scope
 * 拦截器 / MCP 鉴权处调 expandScope() 展开成内部过滤维(sourceUnits + clinicIds)。
 * 好处:JWT 解出来跟 host 发进来的一致,不泄漏 PAC schema 词汇(clinic/source_unit)。
 *
 * 树按 **tenantId** 选(树的 groupId 就是 tenantId,天然 key)。jvs-dw 有派生树;
 * 未知 tenantId 用退化树(根=tenantId,无子)—— orgScope 里的诊所 id 当裸诊所透传、
 * sourceUnits 留空(单命名空间)、根 id(=tenantId)= 不限。通用态接新 host 时补树来源。
 */
import { JVS_DW_PRESETS } from './jvs-dw-preset';
import {
  buildOrgTree,
  buildTree,
  expandOrgScope,
  type ExpandedScope,
  type OrgTree,
} from './org-scope';

/** tenantId → org 树。jvs-dw 内置;其余按需(通用态从摄入数据派生)。 */
const TREES: Record<string, OrgTree> = {
  [JVS_DW_PRESETS.ruier.tenantId]: buildOrgTree(JVS_DW_PRESETS.ruier.tenantId, {
    [JVS_DW_PRESETS.ruier.sourceUnit]: Object.keys(JVS_DW_PRESETS.ruier.clinics),
    [JVS_DW_PRESETS.ruitai.sourceUnit]: Object.keys(JVS_DW_PRESETS.ruitai.clinics),
  }),
};

/** 取 host org 树;未知 tenantId → 退化树(根=tenantId,无子)。 */
export function getOrgTree(tenantId: string): OrgTree {
  return TREES[tenantId] ?? buildTree({ id: tenantId });
}

/** 把 orgScope(任意层级 org 节点)展开成内部过滤维 { sourceUnits, clinicIds }。 */
export function expandScope(tenantId: string, orgScope: string[]): ExpandedScope {
  return expandOrgScope(getOrgTree(tenantId), orgScope);
}
