/**
 * 宿主动作 postMessage 契约 —— PAC(iframe 内)→ 宿主父页。
 *
 * 什么时候走 postMessage:宿主的动作**是弹窗/组件、没有独立 URL**。
 * 有 URL 就配 URL 模板(`actionUrls[key]` 填链接),那是推荐姿势;
 * 配成哨兵字符串 `postMessage` 才走本文件这条通道,并且必须同时配 `actionUrls.HOST_ORIGIN`
 * 作 targetOrigin(不允许 `*` —— 患者信息不能广播给任意父页)。
 *
 * ⭐ 契约放 @pac/types 而不是前端:它是**对外接口**,宿主按它写监听。
 * 放在这里意味着改字段会经过类型检查 + 文档(docs/integration/postmessage-actions.mdx 同源),
 * 而不是某个组件里悄悄多塞一个 key。
 *
 * 兼容纪律:只增字段、不改已有字段语义、不删字段。宿主按 `type + source` 过滤,
 * 多出来的字段它读不到也不会坏。
 */

/** 信封固定字段 —— 宿主用 source+type 过滤,别的 iframe 消息不会误入 */
export const HOST_ACTION_MESSAGE_SOURCE = 'pac' as const;
export const HOST_ACTION_MESSAGE_TYPE = 'action' as const;

/**
 * 病例阶段 —— **PAC 固定发「已咨询」**。
 *
 * 为什么固定:PAC 侧的"潜在治疗"是从诊断/建议推出来的**客观缺口**,还没进宿主的病例流程;
 * 客服点这个按钮的动作语义就是"我已经跟患者聊过、请在宿主侧建单",所以阶段恒为已咨询。
 * PAC 不去推断"已确诊/已排期"这类宿主流程内的状态 —— 那是宿主的真理源,猜错比不给更糟。
 */
export const HOST_CASE_STAGE_CONSULTED = '已咨询' as const;

/**
 * 「打开潜在治疗」的附加载荷(OPEN_POTENTIAL_TREATMENT 专有)。
 *
 * 三个字段都取**客服此刻在页面上看到的东西**,不另算一套 —— 宿主侧建出来的单
 * 要和客服刚才读的那句话对得上,否则对账时说不清。
 */
export interface HostPotentialTreatmentPayload {
  /**
   * 待治疗描述 —— 取页面顶部那句 AI 召回简报(「这通电话的由头」),
   * 简报还没生成好时退回结构化召回原因文本。两者都拿不到 → 空串(字段仍在,别让宿主判 undefined)。
   */
  desc: string;
  /**
   * 关联治疗项目 —— **项目名**数组,共 8 类:
   * 种植 / 正畸 / 早矫 / 根管 / 牙周 / 充填 / 修复 / 拔牙(见 potentialTreatmentItemName)。
   * 无潜在治疗 → 空数组。
   *
   * ⚠️ 不带「治疗」后缀:宿主拿它当项目名落单,「种植治疗」在那边读起来像句子、不像项目。
   * 界面上客服看到的仍是「种植治疗」(业务 2026-07-29 定的展示措辞)—— 两处措辞不同是有意的,
   * 且由同一张表推导(砍后缀),不会各自漂。
   *
   * 为什么发中文不发 code:宿主拿去直接显示/落单最省事;要稳定键按文档里的对照表映一次。
   */
  treatments: string[];
  /** 病例阶段 —— 恒为 {@link HOST_CASE_STAGE_CONSULTED} */
  stage: typeof HOST_CASE_STAGE_CONSULTED;
}

/** 所有动作共有的载荷字段 */
export interface HostActionBasePayload {
  /** 宿主侧患者 id(PAC 的 patients.external_id,即摄入时宿主给的那个 id) */
  patientId: string;
}

/** 完整消息体 —— 宿主 `window.addEventListener('message', ...)` 里 e.data 的形状 */
export interface HostActionMessage {
  source: typeof HOST_ACTION_MESSAGE_SOURCE;
  type: typeof HOST_ACTION_MESSAGE_TYPE;
  /** 动作键,同 actionUrls 的 key(HostActionKey),如 OPEN_POTENTIAL_TREATMENT */
  action: string;
  payload: HostActionBasePayload & Partial<HostPotentialTreatmentPayload>;
}
