/**
 * 画像标签筛选字典 — 列表/选人侧"按画像圈人"的可筛维度(单一真理源)。
 *
 * 与 PERSONA_FEATURE_SPECS(标签卡全集)的关系:这里是**精选的可筛子集**,
 * 每项声明它在 persona_features.data 里的结构化取值位置(dataPath)+ code↔中文。
 * 未收录:acquisition_channel(取值随宿主,非稳定枚举)、discount_anchor(数值型非标签)。
 * code 必须与对应 feature extractor 写入 data 的值一致(rfm.feature.ts 等);
 * 改 extractor 枚举时同步改这里(CI 不强校验,靠 PR review)。
 *
 * 筛选语义(plan.service 实现):同一维度多选 = OR;跨维度 = AND;
 * 匹配的是患者**当前版**画像(personas.supersededAt IS NULL)。
 */
export interface PersonaTagOption {
  /** data 里的结构化取值(英文 code) */
  value: string;
  zh: string;
}

export interface PersonaTagFilterDim {
  /** persona_features.key */
  key: string;
  nameZh: string;
  /** data 里取值的字段名(单层) */
  dataPath: string;
  /** true = data[dataPath] 是 string[](用 array_contains);false = 标量 equals */
  isArray?: boolean;
  options: PersonaTagOption[];
}

export const PERSONA_TAG_FILTER_DIMS: PersonaTagFilterDim[] = [
  {
    key: 'rfm',
    nameZh: '价值分群',
    dataPath: 'segment',
    options: [
      { value: 'important_value', zh: '重要价值' },
      { value: 'important_retain', zh: '重要保持' },
      { value: 'important_develop', zh: '重要发展' },
      { value: 'important_winback', zh: '重要挽留' },
      { value: 'general_value', zh: '一般价值' },
      { value: 'general_retain', zh: '一般保持' },
      { value: 'general_develop', zh: '一般发展' },
      { value: 'low_active', zh: '低活跃' },
    ],
  },
  {
    key: 'lifecycle_stage',
    nameZh: '生命周期',
    dataPath: 'stage',
    options: [
      { value: 'prospect', zh: '潜客' },
      { value: 'new', zh: '新客' },
      { value: 'growth', zh: '成长客' },
      { value: 'mature', zh: '成熟客' },
      { value: 'reactivate', zh: '待激活' },
      { value: 'dormant', zh: '沉睡客' },
      { value: 'churned', zh: '流失客' },
    ],
  },
  {
    key: 'urgency_level',
    nameZh: '紧迫度',
    dataPath: 'level',
    options: [
      { value: 'urgent', zh: '紧急' },
      { value: 'high', zh: '高' },
      { value: 'mid', zh: '中' },
    ],
  },
  {
    key: 'age_bracket',
    nameZh: '年龄段',
    dataPath: 'bracket',
    options: [
      { value: 'infant', zh: '婴幼儿' },
      { value: 'preschool', zh: '学龄前' },
      { value: 'mixed_dentition', zh: '替牙期' },
      { value: 'adolescent', zh: '青少年' },
      { value: 'youth', zh: '青年' },
      { value: 'young_adult', zh: '中青年' },
      { value: 'middle_aged', zh: '中年' },
      { value: 'pre_senior', zh: '中老年' },
      { value: 'senior', zh: '老年' },
    ],
  },
  {
    key: 'gender',
    nameZh: '性别',
    dataPath: 'gender',
    options: [
      { value: 'male', zh: '男' },
      { value: 'female', zh: '女' },
    ],
  },
  {
    key: 'family_structure',
    nameZh: '家庭构成',
    dataPath: 'structure',
    options: [
      { value: 'multigen', zh: '多代之家' },
      { value: 'nuclear', zh: '多口之家' },
      { value: 'couple', zh: '两口之家' },
      { value: 'single', zh: '单身家庭' },
    ],
  },
  {
    key: 'entitlement_status',
    nameZh: '权益身份',
    dataPath: 'types',
    isArray: true,
    options: [
      { value: 'high_insurance', zh: '高端保险直付' },
      { value: 'bank_vip', zh: '银行私行权益' },
      { value: 'stored_value', zh: '储值会员' },
      { value: 'pedo_member', zh: '儿牙会员' },
      { value: 'medical', zh: '医保客户' },
    ],
  },
  {
    key: 'treatment_history',
    nameZh: '治疗史',
    dataPath: 'types',
    isArray: true,
    options: [
      { value: 'implant_history', zh: '种植史' },
      { value: 'ortho_history', zh: '正畸史' },
      { value: 'prostho_history', zh: '修复史' },
      { value: 'perio_history', zh: '牙周治疗史' },
    ],
  },
  {
    key: 'treatment_sensitivity',
    nameZh: '治疗敏感',
    dataPath: 'types',
    isArray: true,
    options: [
      { value: 'dental_fear', zh: '看牙恐惧' },
      { value: 'needle_faint', zh: '晕针' },
      { value: 'blood_faint', zh: '晕血' },
      { value: 'claustrophobia', zh: '密闭恐惧' },
    ],
  },
  {
    key: 'special_attention',
    nameZh: '特殊关注',
    dataPath: 'types',
    isArray: true,
    options: [
      { value: 'frequent_no_show', zh: '屡次爽约' },
      { value: 'often_late', zh: '经常迟到' },
      { value: 'do_not_disturb', zh: '免打扰' },
      { value: 'cannot_wait', zh: '不可等候' },
    ],
  },
  {
    key: 'time_preference',
    nameZh: '时间偏好',
    dataPath: 'types',
    isArray: true,
    options: [
      { value: 'weekday', zh: '工作日' },
      { value: 'weekend', zh: '周末' },
      { value: 'morning', zh: '上午' },
      { value: 'afternoon', zh: '下午' },
      { value: 'evening', zh: '晚间' },
    ],
  },
  {
    key: 'referral_champion',
    nameZh: '转介绍达人',
    dataPath: 'type',
    options: [
      { value: 'family', zh: '家庭型' },
      { value: 'social', zh: '社交型' },
    ],
  },
  {
    key: 'contraindication',
    nameZh: '禁忌',
    dataPath: 'types',
    isArray: true,
    options: [{ value: 'implant_age', zh: '种植年龄禁忌' }],
  },
  {
    key: 'potential_treatment',
    nameZh: '潜在治疗',
    dataPath: 'types',
    isArray: true,
    options: [
      { value: 'implant', zh: '种植' },
      { value: 'ortho', zh: '正畸' },
      { value: 'early_ortho', zh: '早矫' },
      { value: 'endo', zh: '根管' },
      { value: 'perio', zh: '牙周' },
      { value: 'filling', zh: '补牙' },
      { value: 'restoration', zh: '修复' },
      { value: 'extraction', zh: '拔牙' },
    ],
  },
];

/** "key:value" 串(query 上线格式)解析;非法项丢弃。 */
export function parsePersonaTags(raw: string): Array<{ key: string; value: string }> {
  return raw
    .split(',')
    .map((s) => s.trim())
    .filter(Boolean)
    .map((s) => {
      const i = s.indexOf(':');
      if (i <= 0) return null;
      return { key: s.slice(0, i), value: s.slice(i + 1) };
    })
    .filter((x): x is { key: string; value: string } => x !== null);
}
