import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import {
  HOST_ACTION_MESSAGE_SOURCE,
  HOST_ACTION_MESSAGE_TYPE,
  HOST_CASE_STAGE_CONSULTED,
  POTENTIAL_TREATMENT_CARD_LABEL,
} from '@pac/types';

/**
 * postMessage 动作契约 ↔ 交付文档 防漂移。
 *
 * 这份契约是**发给宿主开发照着写监听**的,漂了不会在 PAC 里报错 —— 只会让对方按文档写完发现
 * 收不到 / 值对不上,而且要等到联调才暴露。所以拿测试盯住三件事:
 *   ① 信封固定字段(source/type)别改字面 —— 宿主是按它过滤的
 *   ② 病例阶段恒「已咨询」—— 文档承诺了"恒为",代码里改成别的值就是骗人
 *   ③ 8 类治疗项目的**中文标签和稳定 code 都要在文档里列全** ——
 *      改措辞(labels.ts)或加一类,交付文档必须同步,否则宿主的映射表会缺项
 */
const DOC = readFileSync(
  join(__dirname, '../../pac-docs/content/docs/integration/postmessage-actions.mdx'),
  'utf-8',
);

describe('postMessage 动作契约 ↔ 交付文档', () => {
  test('⭐ 信封固定字段不许改字面(宿主按 source+type 过滤)', () => {
    expect(HOST_ACTION_MESSAGE_SOURCE).toBe('pac');
    expect(HOST_ACTION_MESSAGE_TYPE).toBe('action');
    expect(DOC).toContain("source: 'pac'");
    expect(DOC).toContain("type: 'action'");
  });

  test('⭐ 病例阶段恒「已咨询」—— 文档承诺了"恒为",代码不能偷偷换值', () => {
    expect(HOST_CASE_STAGE_CONSULTED).toBe('已咨询');
    expect(DOC).toContain('已咨询');
  });

  test('⭐ 8 类治疗项目的中文标签 + 稳定 code 都要在交付文档里列全', () => {
    const missing: string[] = [];
    for (const [code, label] of Object.entries(POTENTIAL_TREATMENT_CARD_LABEL)) {
      if (!DOC.includes(label)) missing.push(`标签「${label}」`);
      if (!DOC.includes(`\`${code}\``)) missing.push(`code \`${code}\``);
    }
    expect(missing).toEqual([]);
  });

  test('文档给出了 origin 校验示例 —— 少这一句宿主就等于开后门', () => {
    expect(DOC).toContain('e.origin');
  });
});
