import { daysText } from '../src/modules/ai/orchestrators/recall-brief.orchestrator';

/**
 * 「相差一天,跨了一个月」的回归(2026-08-06 实测)。
 *
 * 原实现是 `Math.round(d / 30)`:74 天 → 约 2 个月,75 天 → 约 3 个月。
 * 同一个患者 5-23 / 5-24 两条回访(相邻一天)于是被简报写成
 * 「2 个月前诊后回访未接,**3 个月前**咨询过种植」—— 读起来像隔了一个月的两件事。
 *
 * ⚠️ 这不是模型在编:它拿到的输入原文就是「75 天(约 3 个月)」。
 *   凡是喂给模型的**换算文本**,算错了它只会照抄,而且看起来完全合理。
 */
describe('daysText —— 向下取整,不虚报', () => {
  test('⭐⭐ 相邻两天不许跨月(原 bug 的最小复现)', () => {
    expect(daysText(74)).toContain('约 2 个月');
    expect(daysText(75)).toContain('约 2 个月');
  });

  test('⭐ 单调:天数只增不减,月数不许回退', () => {
    let prev = 0;
    for (let d = 60; d <= 400; d++) {
      const m = Number(/约 ([\d.]+) (个月|年)/.exec(daysText(d))?.[1] ?? 0);
      const norm = daysText(d).includes('年') ? m * 12 : m;
      expect(norm).toBeGreaterThanOrEqual(prev);
      prev = norm;
    }
  });

  test('⛔ 不许高估 —— 说出来的月数不能超过真实月数', () => {
    for (const d of [61, 75, 89, 91, 100, 200, 364]) {
      const m = Number(/约 (\d+) 个月/.exec(daysText(d))?.[1] ?? 0);
      expect(m * 30.44).toBeLessThanOrEqual(d);
    }
  });

  test('60 天以内给天数,不换算', () => {
    expect(daysText(59)).toBe('59 天');
    expect(daysText(1)).toBe('1 天');
    expect(daysText(0)).toBe('近期');
  });

  test('满一年走年档,且同样不高估', () => {
    expect(daysText(364)).toContain('个月'); // 差一天还在月档
    expect(daysText(365)).toContain('约 1 年');
    expect(daysText(400)).toContain('约 1 年'); // 1.09 → 向下到 1(⛔ 不许说成 1.1 年)
    expect(daysText(550)).toContain('约 1.5 年');
    expect(daysText(740)).toContain('约 2 年');
  });
});
