#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""《宝锐销售助手 · 使用手册》v2 —— 覆盖已开放能力（按"建议开"55 项技能归纳）。

口径要求（沿用 2026-10-12 用户指令）：
  · 面向使用助手的销售本人，纯使用说明
  · 不含任何内部机制/路径/账号/他人信息，也不出现"已过滤/已脱敏"这类背景
"""
import os
import re
import sys
from datetime import datetime

sys.path.insert(0, os.path.expanduser('~/Desktop/Hermes输出-工作类/脚本'))
import brand_kit as BK  # noqa: E402

OUT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类/团队共享/宝锐销售助手_使用手册.html'
NOW = datetime.now().strftime('%Y-%m-%d')

GROUPS = [
    ('一、客户与商机', '从"要去拜访"到"回来复盘"的全流程', [
        ('访前准备', '下周去苏州天隆，帮我准备一下', '研究方向、关键人、近期跟进、在测产品、可带的话术与方案'),
        ('客户采购与走势', '苏州天隆今年买了多少？跟去年同期比呢？主要买哪些货', '年度/月度金额、同比、主销货号与订单明细'),
        ('客户台账与项目时间线', '把我跟这家客户两年的往来理成一条时间线', '按时间排好的项目节点与进展'),
        ('拜访纪要成稿', '把这次沟通整理成拜访纪要，重点写测试进展和下一步', '可直接编辑的纪要（手写笔记拍照也能识别）'),
        ('测试反馈复盘', '这几家反馈的灵敏度问题，跟他们的订单对一下', '反馈要点 + 相关采购记录对照'),
        ('货号与归属查询', 'AS412-9 是什么？哪个项目在用？谁在买', '货号全名、所属项目、客户使用情况'),
        ('客户特殊要求与客诉', '这家有没有特殊包装或运输要求？以前有没有过客诉', '特殊要求（包装/交付/质检/账期）与客诉记录'),
    ]),
    ('二、产品与技术', '选型、答疑、排查，都要站得住', [
        ('选型推荐', '客户要做多重 PCR，引探体系推荐哪个货号？有没有更耐受的版本', '按客户体系给货号建议与备选，说明理由'),
        ('技术问答（附依据）', '这个体系能不能耐受 60℃ 预变性？会不会影响灵敏度', '判断 + 依据 + 建议的验证实验'),
        ('参数横向对比', '我们的 RT 酶跟竞品比，耐热性差在哪', '关键参数与实测证据对比，可用于现场答疑'),
        ('价格与报价口径', '这个货号今年的成交价区间是多少？跟官价差多少', '官价、成交价区间、按量阶梯'),
        ('体系辅料与添加剂', '这个体系要不要加辅助蛋白？加多少合适', '加不加、加多少、配套货号'),
        ('异常排查', '客户说曲线起线晚、非特异，怎么排查', '分诊路径与排查实验清单'),
        ('冻干方案', '客户要冻干，保护剂怎么配？能不能外包', '配方思路、形态要点、承接方式'),
        ('耐药与突变位点', '这几个位点能不能做成荧光 PCR 多重', '位点分组、可判型方案、货号建议'),
        ('科研产品线', '客户问 circRNA 模板制备，推哪个', '科研线产品与推荐组合'),
    ]),
    ('三、市场与竞品', '客户面前能讲得出、讲得对', [
        ('竞品梳理', '帮我梳理一下竞品在分子诊断原料上的产品布局', '产品线、定位、优劣势对照'),
        ('市场分析', '分子诊断原料今年是什么行情？价格趋势如何', '基于公开信息的行业与价格趋势'),
        ('客户终端赛道格局', '我这家客户所在的终端赛道，竞争情况怎么样', '赛道玩家、格局与竞争要素'),
        ('拜访行业情报', '去之前给我几条行业热点和能聊的话题', '热点 + 话题清单，可直接用于寒暄'),
        ('竞品动态跟踪', '盯一下主要竞品最近有什么新动作', '带出处的动态摘要'),
        ('企业信息查询', '查一下这家客户的工商背景和规模', '工商信息、成立时间、规模等公开信息'),
    ]),
    ('四、文献与证据', '给客户的每个结论都能落到出处', [
        ('文献检索', '找几篇冻干保护剂相关的文献，要能支撑我给客户的方案', '文献清单 + 要点提炼'),
        ('文献深挖', '这个方向现在研究到哪一步了？还有什么空白', '研究进展与空白点分析'),
        ('开放获取', '这篇付费文献有没有开放版本', '合法的开放获取渠道'),
    ]),
    ('五、材料与交付', '做出来的东西直接能用', [
        ('品牌规范物料', '（任何产出自动带公司标识与口号，符合公司规范）', '免去你手工排版'),
        ('数据看板 / 单页', '把这批数据做成一页能筛选查看的页面', '自包含页面，可发可投屏'),
        ('汇报 PPT', '按季度数据做一份汇报 PPT，带演讲备注', '成稿 PPT + 备注稿'),
        ('培训材料', '给新人做一份选型入门材料', '教材 + 可交互示例'),
        ('表格处理', '把这张表整理成 Excel，按区域拆成两张', '规整好的 Excel / CSV'),
        ('文档转写', '把这份 PDF / Word / PPT 转成 Markdown', '保真转写稿（含表格）'),
        ('思维导图', '把这份资料拆成一张导图', '结构化导图文件'),
    ]),
    ('六、识别与转写', '把线下的东西变成能用的文字', [
        ('手写笔记识别', '（拍一张笔记照片发过来即可）', '转成文字，可直接编辑整理'),
        ('图片文字提取', '（发截图，例如文章、页面截图）', '提取干净的文字'),
        ('录音转写', '（把拜访或会议录音发过来）', '转成文字稿，再让助手整理成纪要'),
    ]),
    ('七、其他', '', [
        ('快递物流查询', '这单顺丰现在到哪了', '物流轨迹与签收状态'),
    ]),
]

QUICK = [
    ('带上客户名', '「苏州天隆…」比「那个客户…」准确得多，也不会问错对象'),
    ('说清时间范围', '「今年」「三季度」「近三个月」，避免给到你不需要的区间'),
    ('说明用途', '「给客户看的方案」和「内部判断」要的详略不一样，说一句就能对上'),
    ('一次一件事', '问题拆开发更准，也方便你逐条确认'),
    ('结果不满意就追问', '「第 3 点再展开」「换成表格给我」「只看浙江」——它会接着改'),
]

FAQ = [
    ('它会不会编数字？', '只引用系统里的真实记录，查不到会说查不到。这也是它偶尔回"没有数据"的原因。'),
    ('数据跟实际不一致怎么办？', '以系统记录为准；发现对不上告诉刘新元，会核对更新。'),
    ('我在外面出差能用吗？', '能，微信里随时可用，不需要安装任何软件。'),
    ('能帮我直接发给客户吗？', '不能。它只做分析和材料准备，对外发送请你自己确认后走正常渠道。'),
    ('它做的材料能直接用吗？', '可以，但对外正式材料请按流程再过一遍评审——技术结论已附出处，商务口径以公司为准。'),
    ('它能帮我改系统里的价格、订单、客户归属吗？', '不能。这些由系统和管理端维护，助手只做查询与分析。'),
    ('它说"不在你的范围内"是什么意思？', '助手只服务你负责的客户。要查其他客户，找刘新元开通。'),
]


def card(t, q, a):
    return ('<div class="cap"><div class="ct">%s</div>'
            '<div class="row"><span class="lb">你可以这样说</span><div class="q">%s</div></div>'
            '<div class="row"><span class="lb g">它会给到</span><div class="a">%s</div></div></div>' % (t, q, a))


def main():
    secs = []
    for title, sub, items in GROUPS:
        secs.append('<h2>%s%s</h2><div class="grid">%s</div>'
                    % (title, ('<span class="sub2">%s</span>' % sub) if sub else '',
                       ''.join(card(*i) for i in items)))
    html = """<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">
<title>宝锐销售助手 · 使用手册</title><style>
:root{--blue:#0b5fa5;--blue2:#1e88e5;--ink:#16202b;--muted:#5b6b7c;--line:#e3ebf3;--bg:#f6f9fc}
*{box-sizing:border-box}
body{margin:0;font:15px/1.75 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:var(--ink);background:var(--bg)}
main{max-width:1000px;margin:0 auto;padding:26px 20px 8px}
.hero{background:linear-gradient(135deg,#0b5fa5,#1e88e5);color:#fff;border-radius:14px;padding:22px 24px}
.hero h1{color:#fff;margin:0 0 8px;font-size:26px}
.hero p{margin:0;opacity:.95}
h2{font-size:19px;margin:30px 0 12px;padding-left:11px;border-left:4px solid var(--blue)}
.sub2{font-size:13px;color:var(--muted);font-weight:400;margin-left:8px}
.grid{display:grid;grid-template-columns:1fr;gap:11px}
.cap{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 16px;box-shadow:0 1px 2px rgba(11,95,165,.04)}
.ct{font-weight:700;color:var(--blue);font-size:16px;margin-bottom:8px}
.row{display:flex;gap:10px;align-items:flex-start;margin-top:6px}
.lb{flex:0 0 82px;font-size:12px;background:var(--blue2);color:#fff;border-radius:6px;text-align:center;padding:3px 0;margin-top:3px}
.lb.g{background:#7aa9d0}
.q{font-weight:600}.a{color:var(--muted)}
.flow{display:flex;gap:10px;flex-wrap:wrap;margin-top:10px}
.step{flex:1 1 190px;background:#fff;border:1px dashed #b9d2e8;border-radius:12px;padding:12px 14px}
.step b{display:block;color:var(--blue);margin-bottom:4px}
.quick{display:grid;grid-template-columns:repeat(2,1fr);gap:11px}
.qi{background:#fff;border:1px solid var(--line);border-radius:12px;padding:13px 15px}
.qi b{color:var(--blue)}
.note{background:#fff8e6;border:1px solid #f2dfae;border-radius:12px;padding:14px 18px;margin-top:12px}
.note ul{margin:6px 0 0;padding-left:20px}.note li{margin:5px 0}
dl.qa{background:#fff;border:1px solid var(--line);border-radius:12px;padding:4px 18px 14px}
dl.qa dt{font-weight:700;margin:14px 0 4px}dl.qa dd{margin:0;color:var(--muted)}
@media(max-width:720px){.quick{grid-template-columns:1fr}}
</style></head><body><main>
<div class="hero"><h1>宝锐销售助手 · 使用手册</h1>
<p>微信里直接说话，就能做访前准备、客户与订单查询、产品技术解答、竞品与市场调研、文献检索，也能帮你把材料做出来。</p></div>
<div style="color:var(--muted);margin:12px 0 0">不需要装任何软件、不用记命令 —— 把需求说清楚就行。</div>
""" + ''.join(secs) + """
<h2>怎么问，效果最好</h2>
<div class="quick">
""" + ''.join('<div class="qi"><b>%s</b><div class="a">%s</div></div>' % q for q in QUICK) + """
</div>

<h2>关于数据范围</h2>
<div class="note">
<ul>
  <li>助手服务的是<strong>你负责的客户</strong>：订单、跟进记录、客诉、成交价、特殊要求都能查、能分析。</li>
  <li>问其他客户的资料，它会告诉你不在你的范围内 —— 这是公司数据权限的正常要求，需要开通请找刘新元。</li>
  <li>数据以系统记录为准；发现与实际对不上，告诉刘新元，会核对更新。</li>
</ul>
</div>

<h2>使用注意</h2>
<div class="note">
<ul>
  <li>涉及客户的资料请按公司保密要求使用，不要转发到公司以外。</li>
  <li>技术类结论会附出处；对外正式材料请按流程再过一遍评审。</li>
  <li>它不代替你做决定，也不替你改系统里的数据 —— 价格、订单、客户归属都由系统和管理端维护。</li>
</ul>
</div>

<h2>常见问题</h2>
<dl class="qa">
""" + ''.join('<dt>%s</dt><dd>%s</dd>' % f for f in FAQ) + """
</dl>
</main></body></html>"""

    html = BK.inject(html, theme='light', tag='营销中心 · 销售助手', footer_extra='使用手册 · ' + NOW)
    v = BK.verify(html)
    print('品牌自检:', v)
    assert all(v.values()), v
    html = re.sub(r'/\*\s*=+\s*bior-brand-v1.*?\*/', '/* bior-brand-v1 · 宝锐品牌样式 */', html, flags=re.S)
    banned = ['代码:', '.hermes', 'profiles', 'SOUL', 'user_id', 'o9cq80', 'customer_attribution',
              '数据包', 'baorui-sales', 'api_key', 'sk-', '/Users/', '.json', '.py', '赵云浩', '黄文才',
              '陈溪子', '超管', 'allowlist', '白名单', '脱敏', '已过滤', '隔离机制', 'token', 'brand_kit', 'ERP']
    hits = [b for b in banned if b in html]
    print('敏感/内部信息扫描:', hits or '无 ✅')
    assert not hits, hits
    os.makedirs(os.path.dirname(OUT), exist_ok=True)
    open(OUT, 'w', encoding='utf-8').write(html)
    print('能力条目 %d 个 ｜ 分组 %d 个' % (sum(len(g[2]) for g in GROUPS), len(GROUPS)))
    print('→ %s（%.1f KB）' % (OUT, os.path.getsize(OUT) / 1024.0))


if __name__ == '__main__':
    main()
