'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,
  children,
}: {
  featureKey: string;
  children: React.ReactNode;
}) {
  const meta = ALGORITHMS[featureKey];
  if (!meta) return <>{children}</>;
  return (
    <HoverCard openDelay={150} closeDelay={80}>
      {/* 直接把 children 作为 trigger,radix 锚定 children 本身的位置(避免多包一层 0 尺寸 span)*/}
      <HoverCardTrigger asChild>{children}</HoverCardTrigger>
      <HoverCardContent align="end" sideOffset={6} className="w-80 p-3 text-[11.5px]">
        <div className="space-y-2">
          <div className="flex items-baseline justify-between border-b border-slate-200 pb-1.5">
            <span className="text-[13px] font-semibold text-slate-900">{meta.title}</span>
            <span className="text-[10.5px] text-slate-500">{meta.subtitle}</span>
          </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>
          )}
          <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.VALUE]: {
    title: '患者价值',
    subtitle: '生命周期付费档位',
    formula: '累计付费 = 付款 + 充值 − 退款',
    rules: [
      { label: 'VIP 钻卡', body: '累计 ≥ ¥30,000' },
      { label: 'VIP 金卡', body: '累计 ≥ ¥10,000' },
      { label: 'VIP 银卡', body: '累计 ≥ ¥3,000' },
      { label: '普通付费', body: '累计 ≥ ¥500' },
      { label: '新客 / 未消费', body: '< ¥500' },
    ],
    note: '档位影响召回优先级"价值加分"(0 / 2 / 5 / 10 / 20)',
  },
  [PersonaFeatureKey.TREATMENT_CHAIN_STATUS]: {
    title: '治疗链状态',
    subtitle: '诊断 vs 实际治疗对齐',
    rules: [
      { label: '缺口', body: '有诊断但未做对应类别治疗 → 召回核心信号' },
      { label: '在管', body: '诊断后有同类治疗记录,治疗链推进中' },
      { label: '闭环', body: '同类治疗已完成、无后续风险(牙周等终身维护类除外)' },
    ],
    note: '诊断→治疗类别用统一映射表(如 K02 龋齿 → 充填/嵌体)',
  },
  [PersonaFeatureKey.RECALL_RISK]: {
    title: '流失风险',
    subtitle: '复发 + 长期未触达',
    rules: [
      { label: '高', body: '距上次临床事件 ≥ 540 天 + 治疗链有缺口' },
      { label: '中', body: '距上次 ≥ 360 天,或 治疗链有缺口' },
      { label: '低', body: '距上次 ≥ 180 天' },
      { label: '无', body: '< 180 天 且 链无缺口' },
    ],
    note: '影响召回优先级"转化加分"(无=0 / 低=2 / 中=4 / 高=6)',
  },
  [PersonaFeatureKey.DO_NOT_CONTACT_STATUS]: {
    title: '不打扰状态',
    subtitle: '合规硬约束',
    rules: [
      { label: '不打扰', body: '主档标记不打扰 / 患者已故 / 有未关闭投诉记录' },
      { label: '可触达', body: '上述全无' },
    ],
    note: '不打扰时召回引擎硬拦截,不生成 / 已生成的不派单。电话缺失算"待补充电话",不算不打扰',
  },
  [PersonaFeatureKey.ENTITLEMENT_STATUS]: {
    title: '权益身份',
    subtitle: '商保 / 医保结算史(事实投影,史+最近日期)',
    rules: [
      { label: '商保客户', body: '历史用商业保险结算过(channel=保险 或 有保司名),展示保司 + 最近一次日期' },
      { label: '医保结算', body: '用过社保医保结算(普惠,非高端 VIP 信号)' },
      { label: '不打标签', body: '无任何保险结算记录' },
    ],
    note: '商保强时效(雇主团险换工作即失效,DW 无保单有效期)→ 只陈述"曾经+最近日期",不断言"当前在保";新鲜度由人/打分器按最近日期判断',
  },
};
