'use client';

import * as React from 'react';
import { PersonaFeatureKey } from '@pac/types';
import { HoverCard, HoverCardTrigger, HoverCardContent } from '@/components/ui/hover-card';

/**
 * PersonaFeatureHover — 患者画像 4 个 feature 的算法说明 hover card。
 *
 * 数据来源:apps/pac-service/src/modules/persona/features/*.feature.ts 顶部 JSDoc。
 * 算法 doc 改动时同步这里(后续可考虑后端返回 description,前端零硬编码)。
 *
 * 触发器(children)在 feature 卡片右上角放一个 ? 图标。
 */
export function PersonaFeatureHover({
  featureKey,
  value,
  children,
}: {
  featureKey: string;
  /// 该患者的实际取值(原生 title 内容并入 hovercard 顶部)
  value?: string;
  children: React.ReactNode;
}) {
  const meta = ALGORITHMS[featureKey];
  if (!meta && !value) return <>{children}</>;
  return (
    <HoverCard openDelay={150} closeDelay={80}>
      {/* 直接把 children 作为 trigger,radix 锚定 children 本身的位置(避免多包一层 0 尺寸 span)*/}
      <HoverCardTrigger asChild>{children}</HoverCardTrigger>
      {/* z-[70]:抽屉面板是 z-[60],默认 hovercard z-50 会被抽屉盖住(详情抽屉里 ? hover 不显的根因) */}
      <HoverCardContent align="end" sideOffset={6} className="z-[70] w-80 p-3 text-[11.5px]">
        <div className="space-y-2">
          <div className="flex items-baseline justify-between border-b border-slate-100 pb-1.5">
            <span className="text-[13px] font-semibold text-slate-900">{meta?.title ?? featureKey}</span>
            {meta?.subtitle && <span className="text-[10.5px] text-slate-500">{meta.subtitle}</span>}
          </div>
          {/* 本患者实际取值(原 title 内容)*/}
          {value && (
            <div className="rounded bg-teal-50 px-2 py-1.5 text-[11px] text-teal-800 leading-relaxed">
              {value}
            </div>
          )}
          {meta?.formula && (
            <div className="rounded bg-slate-50 px-2 py-1.5 font-mono text-[10.5px] text-slate-700 leading-relaxed">
              {meta.formula}
            </div>
          )}
          {meta && (
            <ul className="space-y-1 text-slate-600 leading-relaxed">
              {meta.rules.map((r, i) => (
                <li key={i} className="flex gap-2">
                  <span className="text-slate-400 flex-none">·</span>
                  <span>
                    {r.label && <strong className="text-slate-800 mr-1">{r.label}</strong>}
                    {r.body}
                  </span>
                </li>
              ))}
            </ul>
          )}
          {meta?.note && (
            <p className="border-t border-slate-100 pt-1.5 text-[10.5px] text-slate-500 leading-relaxed">
              {meta.note}
            </p>
          )}
        </div>
      </HoverCardContent>
    </HoverCard>
  );
}

interface AlgoMeta {
  title: string;
  subtitle: string;
  formula?: string;
  rules: { label?: string; body: string }[];
  note?: string;
}

const ALGORITHMS: Record<string, AlgoMeta> = {
  [PersonaFeatureKey.RFM]: {
    title: '价值分群 (RFM)',
    subtitle: '按最近就诊 · 频次 · 累计消费',
    rules: [
      { label: '重要价值', body: '近期来过、高频、消费高' },
      { label: '重要保持/发展/挽留', body: '消费高,但最近度或频次偏弱' },
      { label: '一般价值/保持/发展', body: '消费偏低的对应象限' },
      { label: '低活跃', body: '很久没来,或各项都偏低' },
    ],
  },
  [PersonaFeatureKey.AGE_BRACKET]: {
    title: '年龄段',
    subtitle: '按生日当下计算',
    rules: [
      { body: '婴幼儿 0-2 / 学龄前 3-6 / 替牙期 7-11 / 青少年 12-17' },
      { body: '青年 18-25 / 中青年 26-30 / 中年 31-45 / 中老年 46-54 / 老年 ≥55' },
    ],
  },
  [PersonaFeatureKey.GENDER]: {
    title: '性别',
    subtitle: '影响话术与项目推荐',
    rules: [{ label: '男性 / 女性 / 未知', body: '按建档性别' }],
  },
  [PersonaFeatureKey.ACQUISITION_CHANNEL]: {
    title: '获客渠道',
    subtitle: '客户首次到诊的来源',
    rules: [{ body: '按客户首次到诊的来源判定,确定后不再变' }],
  },
  [PersonaFeatureKey.FAMILY_STRUCTURE]: {
    title: '家庭构成',
    subtitle: '按直系亲属关系推断',
    rules: [
      { label: '多代之家', body: '有长辈(父母 / 祖辈)' },
      { label: '多口之家', body: '有子女' },
      { label: '两口之家', body: '有配偶' },
      { label: '单身家庭', body: '仅有同辈 / 朋友等非直系' },
    ],
  },
  [PersonaFeatureKey.REFERRAL_CHAMPION]: {
    title: '转介绍达人',
    subtitle: '推荐过他人且带来成交',
    rules: [
      { label: '家庭型', body: '带家人(直系 ≥3 人)' },
      { label: '社交型', body: '推外人(≥3 人)' },
    ],
  },
  [PersonaFeatureKey.LIFECYCLE_STAGE]: {
    title: '生命周期',
    subtitle: '按就诊时间 + 消费',
    rules: [
      { label: '潜客', body: '尚未到诊,只约过 / 咨询过' },
      { label: '新客', body: '首诊半年内、就诊 ≤3 次' },
      { label: '成长客', body: '近一年消费明显上升' },
      { label: '成熟客', body: '到诊稳定、消费平稳' },
      { label: '待激活 / 沉睡 / 流失', body: '末次就诊越久,越靠后' },
    ],
  },
  [PersonaFeatureKey.TREATMENT_HISTORY]: {
    title: '治疗史',
    subtitle: '做过的核心治疗类型',
    rules: [
      { label: '种植史', body: '种过牙' },
      { label: '正畸史', body: '做过矫正' },
      { label: '修复史', body: '冠桥 / 贴面 / 嵌体' },
      { label: '牙周治疗史', body: '洁牙 / 刮治 / 牙周序列' },
    ],
    note: '基础治疗(拔牙 / 补牙 / 根管)不计入',
  },
  [PersonaFeatureKey.TIME_PREFERENCE]: {
    title: '时间偏好',
    subtitle: '习惯的就诊时段',
    rules: [
      { label: '工作日 / 周末', body: '按近两年预约时间占比' },
      { label: '上午 / 下午 / 晚间', body: '同上,占比过半即标' },
    ],
  },
  [PersonaFeatureKey.DISCOUNT_ANCHOR]: {
    title: '折扣锚点',
    subtitle: '历史最深的一次折扣',
    rules: [
      { body: '取真实治疗(原价 ≥¥500)上谈到的最低折扣 + 日期 / 项目' },
      { body: '免费洁牙 / 检查等促销不计入' },
    ],
    note: '作谈优惠的价格底线参考',
  },
  [PersonaFeatureKey.SPECIAL_ATTENTION]: {
    title: '特别关注',
    subtitle: '排班 / 触达需注意',
    rules: [
      { label: '屡次爽约', body: '近一年履约率偏低' },
      { label: '经常迟到', body: '多次迟到超 15 分钟' },
      { label: '免打扰', body: '已标记不打扰' },
      { label: '不可等候', body: '病历 / 备注提到赶时间、不能等' },
    ],
  },
  [PersonaFeatureKey.TREATMENT_SENSITIVITY]: {
    title: '治疗敏感',
    subtitle: '沟通需安抚的点',
    rules: [
      { label: '看牙恐惧', body: '牙科恐惧 / 害怕看牙' },
      { label: '晕针 / 晕血', body: '晕针·怕打针 / 晕血·见血不适' },
      { label: '密闭恐惧', body: '幽闭 / 长时间张口不适' },
    ],
  },
  [PersonaFeatureKey.CONTRAINDICATION]: {
    title: '禁忌标签',
    subtitle: '治疗安全预警',
    rules: [{ label: '种植禁忌', body: '未满 18 岁(骨骼未发育完全)' }],
    note: '满 19 岁后自动解除',
  },
  [PersonaFeatureKey.URGENCY_LEVEL]: {
    title: '急迫等级',
    subtitle: '按末次就诊距今',
    rules: [
      { label: '紧急', body: '有待治项且 90 天以上没来' },
      { label: '高', body: '30-90 天没来' },
      { label: '中', body: '近期来过或新发现' },
    ],
  },
  [PersonaFeatureKey.POTENTIAL_TREATMENT]: {
    title: '潜在治疗',
    subtitle: '诊断 / 建议了但还没做',
    rules: [
      { label: '种植 / 修复 / 拔牙', body: '缺牙、需冠桥、残根需拔' },
      { label: '正畸 / 早矫', body: '按年龄分成人正畸 / 儿童早矫' },
      { label: '根管 / 牙周 / 补牙', body: '牙髓、牙周、龋齿' },
    ],
  },
  [PersonaFeatureKey.ENTITLEMENT_STATUS]: {
    title: '权益身份',
    subtitle: '保险结算历史',
    rules: [
      { label: '商保客户', body: '用过商业保险结算(显示保司 + 最近日期)' },
      { label: '医保结算', body: '用过社保医保结算' },
    ],
    note: '只表示曾用保险结算,不代表当前在保',
  },
};
