/**
 * Persona Feature Registry(标签注册表)— 单一真理源(代码,git/PR review)
 *
 * 画像的核心是「标签化」。每个标签按业务整理好的「标签卡」形式定义(对齐 CDP 标签中台 / OneModel):
 *   标签值 / 数据来源 / 数据字段 / 标签释义 / 计算算法 + 时间语义 / 层级 / owner / version。
 *
 * - 存储:**代码常量**(本文件),不落库;DB(persona_features)只存每患者每标签的实例值。
 * - 时间语义:每个标签自己声明(snapshot 当前态 / window 窗口 / lifetime 全史 / trend 趋势 / mixed)。
 * - 收口:producer 产出的 key 必须在此登记(CI 防漂移,见 persona-design-v2.md §二)。
 * - 来源可切:同一标签现可从 PAC 事实层自算,宿主 CDP 报表给出后切宿主值,口径(算法)不变。
 */
export type FeatureTier = 'rule' | 'statistical' | 'model' | 'llm';
export type FeatureTimeSemantics = 'snapshot' | 'window' | 'lifetime' | 'trend' | 'mixed';

export interface PersonaFeatureSpec {
  key: string; // PersonaFeatureKey
  nameZh: string; // 标签名
  tier: FeatureTier; // 层级:规则 / 统计 / 模型 / LLM
  timeSemantics: FeatureTimeSemantics; // 时间语义
  labelValues?: string[]; // 标签值(枚举型标签)
  dataSource: string; // 数据来源(现状 + 未来切换)
  dataFields: string[]; // 数据字段
  meaning: string; // 标签释义
  algorithm: string; // 计算算法(口径,人读;真理实现在 extractor)
  owner: string;
  version: number;
}

export const PERSONA_FEATURE_SPECS: Record<string, PersonaFeatureSpec> = {
  // ── B.1.1 RFM 层级(业务整理好的 CDP 口径,直接采用)──
  rfm: {
    key: 'rfm',
    nameZh: '价值分群(RFM)',
    tier: 'statistical',
    timeSemantics: 'mixed', // R=snapshot(最近) F/M=lifetime
    labelValues: [
      '重要价值客户',
      '重要保持客户',
      '重要发展客户',
      '重要挽留客户',
      '一般价值客户',
      '一般保持客户',
      '一般发展客户',
      '低活跃客户',
    ],
    dataSource:
      '现:PAC 事实层自算(encounter/treatment(actual)/挂号 + payment/recharge/refund);未来:宿主 CDP「客户综合分析报表」直接给 R/F/M',
    dataFields: ['last_visit_time', 'visit_times', 'net_receipts_total'],
    meaning: '基于最近就诊时间(R)、就诊频次(F)、累计消费(M)三维度的客户价值分层',
    algorithm: [
      'Step1 R/F/M 得分(1-5):',
      '  R ≤540天=5 / 541-730=4 / 731-1095=3 / 1096-1460=2 / >1460=1',
      '  F ≥5次=5 / 3-4次=4 / 2次=2 / 1次=1',
      '  M 累计消费分位:TOP20%=5 / 20-40%=4 / 40-60%=3 / 60-80%=2 / BOTTOM20%=1(租户内分位)',
      'Step2 分层:',
      '  R≥4 F≥3 M≥4→重要价值 / R=3 F≥3 M≥4→重要保持 / R≥4 F=2 M≥4→重要发展 / R≤2 F≥3 M≥4→重要挽留',
      '  R≥4 F≥3 M<4→一般价值 / R=3 F≥3 M<4→一般保持 / R≥4 F=2 M<4→一般发展 / 其余(含 R≤2 任意)→低活跃',
    ].join('\n'),
    owner: 'pac-algo',
    version: 1,
  },
};
