#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""把「产品验证资料索引」生成知识库卡片（工作台 AI 助手可检索）。

输出：知识库-copilot/_文本层/公用/产品验证/<系列>.md（56 张）
然后需运行：python3 脚本/kb_build_index.py 重建 数据/kb_index.json

边界（与微信侧一致）：
  · 系列级证据，不得说成尾号专属
  · 不承诺有效期（报告只写考察时长）
  · 产品级、不含客户信息；不外发 PDF
"""
import json
import os
import re
from collections import Counter

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
IDX = os.path.join(ROOT, '数据', 'validation_index.json')
OUTDIR = os.path.join(ROOT, '知识库-copilot', '_文本层', '公用', '产品验证')

TYPES = ['效期/实时稳定性', '运输稳定性', '加速稳定性', '冻融稳定性', '性能/扩增数据', '其他']


def typ(f):
    if '稳定性研究资料' in f:          # 45 页综合报告：含效期/冻融/运输/开瓶
        return '效期/实时稳定性'
    if any(k in f for k in ('效期', '实时稳定', '长期')):
        return '效期/实时稳定性'
    if any(k in f for k in ('运输', '物流', '航空')):
        return '运输稳定性'
    if any(k in f for k in ('加速', '55度', '45度', '37')):
        return '加速稳定性'
    if '冻融' in f:
        return '冻融稳定性'
    if any(k in f for k in ('扩增', '检出率', '灵敏度', '直扩', '对比', '分型')):
        return '性能/扩增数据'
    return '其他'


idx = json.load(open(IDX, encoding='utf-8'))
g = {}
for x in idx:
    g.setdefault(x['sku'], []).append(x)

os.makedirs(OUTDIR, exist_ok=True)
n = 0
for sku, files in sorted(g.items()):
    for f in files:
        f['type'] = typ(f['file'])
    c = Counter(f['type'] for f in files)
    have = [t for t in TYPES if c.get(t)]
    miss = [t for t in ('效期/实时稳定性', '运输稳定性') if not c.get(t)]
    lines = []
    lines.append('---')
    lines.append('title: 产品验证｜%s' % sku)
    lines.append('line: 公用')
    lines.append('owner: 质量部')
    lines.append('updated: 2026-10-24')
    lines.append('keywords: %s 验证 验证数据 稳定性 效期 冻融 加速 运输 长期稳定性 报告' % sku)
    lines.append('summary: %s 系列共 %d 份验证报告（%s）%s' % (
        sku, len(files), '、'.join(have),
        '；缺：' + '、'.join(miss) if miss else ''))
    lines.append('---')
    lines.append('')
    lines.append('# %s 产品验证资料（系列级）' % sku)
    lines.append('')
    lines.append('> **边界**：系列级证据，**不代表某个具体尾号单独做过验证**；报告只给考察时长，'
                 '**不构成有效期承诺**；对外提供走质量部，不直接外发 PDF。')
    lines.append('')
    lines.append('## 一览（先看这里）')
    lines.append('')
    lines.append('| 类型 | 有无 | 关键结论 |')
    lines.append('|---|---|---|')
    for t in TYPES:
        if not c.get(t):
            if t != '其他':
                lines.append('| %s | 无 | 暂无，需补做 |' % t)
            continue
        _f = next(x for x in files if x['type'] == t)
        _cc = (_f.get('conclusion') or '').replace('\n', ' ').strip()
        if not (re.search(r'性能|稳定|一致|合格|通过|符合|无差异|检出', _cc) and not _cc.startswith('判定标准')):
            _cc = '见原件'
        lines.append('| %s | 有（%d 份） | %s |' % (t, c[t], _cc[:90]))
    lines.append('')
    lines.append('## 类型与份数')
    lines.append('')
    for t in TYPES:
        if c.get(t):
            lines.append('- %s：%d 份' % (t, c[t]))
    lines.append('')
    lines.append('## 明细（含结论原文摘要）')
    lines.append('')
    for f in sorted(files, key=lambda x: (TYPES.index(x['type']), x['file'])):
        lines.append('### %s' % f['type'])
        lines.append('- 文件：`%s`（%s 页）' % (f['file'], f.get('pages') or '?'))
        _c = (f.get('conclusion') or '').replace('\n', ' ').strip()
        _ok = bool(re.search(r'性能|稳定|一致|合格|通过|符合|无差异|检出', _c)) and not _c.startswith('判定标准')
        if _ok:
            lines.append('- 结论/摘录：%s' % _c[:180])
        else:
            lines.append('- 结论：见原件（自动摘录不可靠，未写入卡片）')
        if f.get('path'):
            lines.append('- 原件：`%s`' % f['path'])
        lines.append('')
    if miss:
        lines.append('## 缺口')
        lines.append('')
        lines.append('- 本品类缺：%s' % '、'.join(miss))
        lines.append('- 需要补做走《货号验证执行计划》；对客户不得用“一般都有/应该没问题”代替。')
        lines.append('')
    lines.append('## 使用规则')
    lines.append('')
    lines.append('1. 回答前先确认问的是系列还是具体尾号；尾号级要看文件名是否含完整货号。')
    lines.append('2. 只引用上面列出的文件与结论，原文条件（℃、天数、次数）必须带上。')
    lines.append('3. 客户问“能放多久/能不能常温发”，只有效期与运输数据齐全才能答，否则直说“暂无”。')
    lines.append('4. 不出现客户名、金额、订单号；验证资料是产品级证据。')
    lines.append('')
    p = os.path.join(OUTDIR, '%s.md' % sku)
    open(p, 'w', encoding='utf-8').write('\n'.join(lines))
    n += 1

print('生成卡片', n, '张 →', OUTDIR)
