/**
 * DraftRecallSummary AiCall — 把"历史联系(诊所回访记录 patient_return_visits)"归纳成**一句话**。
 *
 * 用途:详情页「历史联系」卡片(ReturnVisitsCard),把多条结构化回访记录压成一句客服可读的概述。
 * 跟 DraftPlanSummary(3 段 plan 摘要)平行,但极轻:输入只有回访记录,输出一句话。
 */
export interface DraftRecallSummaryInput {
  patientNameMasked: string;
  /**
   * 生成时刻的"今天"(YYYY-MM-DD)。
   * ⭐ 必填 —— 回访记录里**含未来排程**(patient_return_visits.task_date 注释写明),
   *   不给锚点模型无从判断某条是"还没到期"还是"漏做了"。
   */
  today: string;
  /** 历史联系(诊所回访)记录,时间倒序 */
  items: Array<{
    taskDate: string | null; // 回访任务日期 YYYY-MM-DD
    type: string | null; // 常规回访 / 术后回访 / 咨询回访
    status: string | null; // 已回访 / 未回访
    /** 任务状态:已完成 / 未完成 / 已预约 / 创建新回访 —— 「已预约」≠「没做」,不给模型会误判 */
    taskStatus: string | null;
    /**
     * ⭐ 该条是否为**尚未到期的未来排程**(taskDate > today)。
     * 由 orchestrator **程序判定**后传入,不让 LLM 自己比日期 —— 这是确定性计算,
     * 跟话术侧"能程序算的事实全算好、LLM 只润色"同一条纪律。
     * 生产事故背景(2026-07):无此字段时模型把 77 天后的排程写成"最新一次未执行,需优先补做",
     * 934 条已生成摘要里 196 条最新回访是未来排程、其中 158 条带"未执行/补做"措辞。
     */
    isFuture: boolean;
    /**
     * ⭐ 该条是否为**最近一次真正发生过的联系**(有日期、且已到期的第一条)。
     * 全列表里**至多一条**为 true;全是未来排程 / 全无日期时一条都没有。
     * 同 isFuture 一样由 orchestrator 程序判定 —— 「哪条最新」是排序问题不是语言问题。
     *
     * 为什么要单独标:业务用户看历史联系时第一诉求就是"上次联系聊了什么"
     * (2026-07 可用性测试原话:"暂时没有办法详细的看到具体一次沟通什么内容"),
     * 摘要必须先回答这一条,再讲整体趋势。
     */
    isLatestPast: boolean;
    /**
     * ⭐ 距今天数(taskDate 到 today;未来排程为负数,无日期为 null)。
     * 同 isFuture / isLatestPast 一样**程序算好**,不让 LLM 自己减日期。
     *
     * 生产事故背景(2026-07-27):模型自己算相对时间,把 2025-12-10 的回访写成
     * 「近3个月」(实为 7.5 个月前)、把末诊 7 个月写成「已超一年未复诊」。
     * 「能程序算的事实全算好、LLM 只润色」—— 与 isFuture 同一条纪律,只是那次补的是
     * "未来 vs 过去"这个轴,漏了"距今多久"这个轴,于是同类错误换个轴又来一遍。
     */
    daysAgo: number | null;
    treatmentItems: string | null; // 关联治疗项(如 种植)
    followContent: string | null; // 回访内容(术后复查 / 洁牙提醒 / 活动邀约…)
    result: string | null; // 回访结果
  }>;
}

export interface DraftRecallSummaryOutput {
  /** 一句话历史联系摘要(中文,≤70 字;先说最近一次,再说整体) */
  summary: string;
}
