/**
 * agent-identity —— 自报家门「生成期占位 / 渲染期回填」。
 *
 * 背景(2026-07 线上 bug):话术缓存 UNIQUE 是 plan_id、召回池又是共享的,
 * 姓名烤进正文 → 晋芳辰先打开触发生成,李倩后打开读到同一份缓存,自报家门成了别人的名字。
 * 这里锁住修复后的契约:正文只存占位符,姓名在读出来的那一刻按当前登录人填。
 */
import {
  AGENT_IDENTITY_PLACEHOLDER,
  agentIdentityText,
  renderAgentIdentity,
  resolveScriptAgent,
} from '../src/modules/ai/calls/draft-plan-script/shared/agent-identity';

describe('resolveScriptAgent | JWT → 自报家门身份', () => {
  test('⭐ 患者侧身份一律「助理」—— 不是客服,也不暴露内部层级', () => {
    expect(
      resolveScriptAgent({
        sub: 'u1',
        role: 'leader',
        dictionary: { users: { u1: '李倩' } },
      }),
    ).toEqual({ name: '李倩', roleTitle: '助理' });
  });

  test('员工 / 管理员 → 同样是"助理"(不把 admin 报成"管理员")', () => {
    expect(resolveScriptAgent({ sub: 'u1', role: 'staff' }).roleTitle).toBe('助理');
    expect(resolveScriptAgent({ sub: 'u1', role: 'admin' }).roleTitle).toBe('助理');
  });

  test('字典缺失 / 空白名 → name=null,不编名字', () => {
    expect(resolveScriptAgent({ sub: 'u1', role: 'staff' }).name).toBeNull();
    expect(
      resolveScriptAgent({ sub: 'u1', role: 'staff', dictionary: { users: { u1: '  ' } } }).name,
    ).toBeNull();
  });

  test('未知角色 → 兜底"助理"', () => {
    expect(resolveScriptAgent({ sub: 'u1', role: 'wat' }).roleTitle).toBe('助理');
  });
});

describe('agentIdentityText | 身份 → 落到话术里的字', () => {
  test('有名字:岗位 + 姓名', () => {
    expect(agentIdentityText({ name: '李倩', roleTitle: '助理' })).toBe('助理李倩');
  });

  test('无名字:只报岗位,绝不编名字', () => {
    expect(agentIdentityText({ name: null, roleTitle: '助理' })).toBe('助理');
    expect(agentIdentityText(null)).toBe('助理');
    expect(agentIdentityText(undefined)).toBe('助理');
  });
});

describe('renderAgentIdentity | 渲染期回填', () => {
  // 正文形如「我是{诊断医生}医生的【回访客服】」—— 占位符前后的字由 prompt 拼,这里只管回填
  const content = `## 开场白\n您好张先生,我是薛医生的${AGENT_IDENTITY_PLACEHOLDER},耽误您两分钟。`;

  test('按当前登录人回填', () => {
    expect(renderAgentIdentity(content, { name: '李倩', roleTitle: '助理' })).toContain(
      '我是薛医生的助理李倩',
    );
  });

  test('⭐ 同一份缓存正文,两个人各读各的名字(线上 bug 的回归锁)', () => {
    const a = renderAgentIdentity(content, { name: '晋芳辰', roleTitle: '助理' });
    const b = renderAgentIdentity(content, { name: '李倩', roleTitle: '助理' });
    expect(a).toContain('晋芳辰');
    expect(a).not.toContain('李倩');
    expect(b).toContain('李倩');
    expect(b).not.toContain('晋芳辰');
  });

  test('无登录身份 → 退回通用"助理";占位符不能漏给患者看到', () => {
    const out = renderAgentIdentity(content);
    expect(out).toContain('我是薛医生的助理');
    expect(out).not.toContain(AGENT_IDENTITY_PLACEHOLDER);
  });

  test('多处出现全部替换', () => {
    const twice = `${AGENT_IDENTITY_PLACEHOLDER} … ${AGENT_IDENTITY_PLACEHOLDER}`;
    expect(renderAgentIdentity(twice, { name: '李倩', roleTitle: '助理' })).toBe('助理李倩 … 助理李倩');
  });

  test('不含占位符 / null 内容 → 原样返回', () => {
    expect(renderAgentIdentity('没有占位符', { name: '李倩', roleTitle: '助理' })).toBe('没有占位符');
    expect(renderAgentIdentity(null)).toBeNull();
  });

  test('不碰客服手填的时间占位', () => {
    const s = `李医生【时间段1】和【时间段2】有空;我是李医生的${AGENT_IDENTITY_PLACEHOLDER}`;
    const out = renderAgentIdentity(s, { name: '李倩', roleTitle: '助理' });
    expect(out).toContain('【时间段1】');
    expect(out).toContain('【时间段2】');
    expect(out).toContain('我是李医生的助理李倩');
  });
});
