#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成《客户宣讲提纲 · 行业热点 + 宝锐特色》自包含可编辑 HTML（35 页骨架 / 30 分钟）。

- 品牌：宝锐蓝 0043C1 / 深蓝 002D80 / 白顶栏 Logo / slogan「守护生命健康，缔造美好生活」
- 尾页三码：公众号 · 小红书 · 视频号（均已解码验明身份）
- 首页可编辑 + 自动保存 + 导出 HTML/JSON + 打印 + 重置（用户硬要求）
"""
import base64, io, os, sys, html as H

HERE = os.path.dirname(os.path.abspath(__file__))
OUT = os.path.join(HERE, '客户宣讲提纲_行业热点+宝锐特色_35页.html')
sys.path.insert(0, os.path.expanduser('~/.hermes/skills/productivity/editable-html-deliverables/templates'))
from html_editable_layer import apply as apply_edit   # noqa: E402

def b64(p):
    ext = p.rsplit('.', 1)[-1].lower()
    mime = 'image/png' if ext == 'png' else 'image/jpeg'
    with open(p, 'rb') as f:
        return 'data:%s;base64,%s' % (mime, base64.b64encode(f.read()).decode())

LOGO = b64(os.path.join(HERE, 'logo.png'))
QR = {'wx': b64(os.path.join(HERE, 'qr_wx.png')),
      'xhs': b64(os.path.join(HERE, 'qr_xhs.png')),
      'sph': b64(os.path.join(HERE, 'qr_sph.png'))}

SLOGAN = '守护生命健康，缔造美好生活'
COMPANY = '珠海宝锐生物科技有限公司'
CONTACT = '电话 0756-8699969 ｜ 邮箱 marketing@biori.com ｜ 网址 www.biori.com ｜ 地址 珠海市香洲区水岸一路88号'

# ── 提纲内容：(章, 页码, 标题, [要点], 讲法提示, 分钟) ──
CH = [
 ('开场', '⏱ 3 分钟'),
 ('01 行业热点', '⏱ 8 分钟'),
 ('02 宝锐是谁', '⏱ 5 分钟'),
 ('03 四个特色能力', '⏱ 7 分钟'),
 ('04 产品矩阵（货号级）', '⏱ 7 分钟'),
 ('05 怎么合作', '⏱ 3 分钟'),
]
PAGES = [
 # 开场
 ('开场', 1, '封面', ['主标题：诊断原料整体解决方案（面向 XX 客户的宣讲主题）', '副标题：一句话说清今天解决什么', '占位：宣讲对象 / 汇报人 / 日期'], '开场 30 秒自我介绍，直接说"今天只讲三件事"。', 1),
 ('开场', 2, '一句话价值主张', ['三句话：① 行业在往快、省冷链、高洁净度走', '② 宝锐在这三件事上有现成体系与货号', '③ 今天只谈怎么把这些接到你的项目上'], '这一页决定客户愿不愿意听下去，务必先讲结论。', 1),
 ('开场', 3, '目录 + 时间分配', ['5 个章节 · 35 页 · 30 分钟', '重点提示：第 3、4 章对你最有价值', 'Q&A 放在最后 5 分钟'], '20 秒带过，把客户注意力引到第 3、4 章。', 1),
 # 01 行业
 ('01 行业热点', 4, '章节页 01 · 行业正在发生什么', ['8 个变化点，最后收口到"你当下最痛的 3 件事"'], '停 3 秒预告结论，不照读标题。', 0.3),
 ('01 行业热点', 5, '热点 1｜快速化：30 分钟内出结果', ['从"能测"到"快测"：POCT、一体机、急诊场景要求扩增 ≤20–30min', '对原料的要求：快速酶 + 快速缓冲体系 + 耐抑制（缩短循环时间会放大抑制）', '对应宝锐：FM2181-4 / FM0181-4 / FM5134 系列'], '先问客户"你们现在的扩增多少分钟"，再讲这一页。', 1.2),
 ('01 行业热点', 6, '热点 2｜全预混 + 冻干化：免冷链', ['趋势：常温运输、基层与海外场景，冷链成本与稳定性是硬约束', '指标从"4℃ 稳定"升级为"2–8℃ 长存 + 37℃/50℃ 加速 + 常温短时"', '对原料的要求：冻干保护剂 + 冻干程序 + 体系协同'], '客户若做海外或基层市场，这一页要停久一点。', 1.2),
 ('01 行业热点', 7, '热点 3｜NA（核酸残留）控制成为准入门槛', ['什么是 NA 残留：生产体系中残留的核酸模板/载体导致假阳或起线', '为什么现在爆发：多重、高灵敏、报证项目对 48 孔/96 孔 0 起线的要求', '对原料的要求：NA 级货号 + 出库质量标准 + 可复现的检测体系'], '这页是"痛点页"，讲完停顿，等客户点头。', 1.2),
 ('01 行业热点', 8, '热点 4｜分子流水线对一致性的硬要求', ['TLA/流水线把"批间差"从研发问题变成产线停线问题', '客户关心：批间一致性、到货检测口径、断供风险', '对应宝锐：体系化货号 + 质量协议 + 备货协同'], '有流水线布局的客户（迈瑞/亚辉龙/新产业/安图一类）重点讲。', 1.0),
 ('01 行业热点', 9, '热点 5｜多重扩增与耐药/突变位点扩展', ['从单靶标走向多重：反应体系里引物探针数量成倍增加', '要求：多靶标间扩增均衡、低丰度靶标不漏检', '对应宝锐：多重体系预混 + 可定制体系调试'], '', 1.0),
 ('01 行业热点', 10, '热点 6｜复杂样本直扩（免提取）', ['趋势：粪便、全血、尿液等直接扩增，绕开提取耗材与时间', '难点：裂解液 pH 偏碱（如 pH11）时酶活性与耐抑制性骤降', '对应宝锐：直扩体系 + 耐抑制酶筛选 + Mg²⁺ 条件调试'], '若有动物诊断/宠物检测客户，这页非常对味。', 1.0),
 ('01 行业热点', 11, '热点 7｜出海与合规：批间稳定性是门票', ['海外注册要求长期稳定性数据 + 批间差异监测方案', '采购谈判前置：价格、货期、账期、质量协议一并谈', '对应宝锐：可提供稳定性与批间差数据支撑'], '', 0.9),
 ('01 行业热点', 12, '热点 8｜国产替代与供应链安全', ['替代动力：成本 + 断供风险 + 海外品牌交期', '替代门槛：不是"能跑通"而是"批批跑得通"', '对应宝锐：国产 + 本地技术支持 + 快速响应'], '', 0.9),
 ('01 行业热点', 13, '行业小结：你当下最痛的 3 件事', ['① 快速化改不动（扩增时间下不来）', '② 冷链/冻干过不去（形态或稳定性衰减）', '③ NA 控制压不住（起线、假阳、报证受阻）', '→ 这三件事正好对应宝锐第 3 章的四个特色能力'], '这是全场第一个高潮：把客户的痛说出来，再翻到第 3 章。', 1.0),
 ('01 行业热点', 14, '选型决策的 3 个维度', ['维度一：体系形态（液体 / 全预混 / 冻干球）', '维度二：性能边界（速度 / 耐抑制 / NA 控制）', '维度三：合作深度（标准品 / 委托冻干 / 联合开发）'], '这页是"选型尺"，后面产品矩阵按这把尺展开。', 0.8),
 # 02 宝锐是谁
 ('02 宝锐是谁', 15, '章节页 02 · 宝锐是谁', ['产能 / 质量 / 研发 / 服务，四件事讲完'], '', 0.3),
 ('02 宝锐是谁', 16, '公司概况', ['成立时间与规模、研发与生产场地、团队构成', '资质与体系（【待补：对外可用的证书/体系名称】）', '产能与服务客户数（【待补：对外口径数字】）'], '对外只讲可核实的口径，数字拿不到就留白，不要估。', 1.2),
 ('02 宝锐是谁', 17, '生产与质量体系', ['批间差控制：原料入库检测 → 生产 → 出库质检', '质量协议 + 客诉响应机制（先响应、再排查、后闭环）', '可提供的质量文件清单'], '', 1.2),
 ('02 宝锐是谁', 18, '研发平台', ['酶定向进化与改造（RT / Taq / Tth / Bst 体系）', '冻干工艺平台（保护剂 + 程序 + 体系协同）', '体系开发与验证（预混、直扩、多重、NA 控制模型）'], '研发型客户会在这里提问，准备 2–3 个技术细节备答。', 1.2),
 ('02 宝锐是谁', 19, '服务能力', ['技术支持随访（研发对研发的对接方式）', '定制开发与快速响应节奏', '样品、测试方案、验证数据三件套同步'], '', 1.1),
 # 03 特色能力
 ('03 四个特色能力', 20, '章节页 03 · 四个特色能力', ['快速 · 冻干全预混 · NA 控制 · 抗抑制'], '', 0.3),
 ('03 四个特色能力', 21, '特色 1｜快速体系', ['结论：快速程序下扩增 ≤20 分钟（与仪器相关）', '实测：45 循环 22 分钟（匿名客户实测）', '对应货号：FM2181-4 / FM0181-4 / FM5134 系列'], '数据只讲结论，原始曲线留给技术交流环节。', 1.5),
 ('03 四个特色能力', 22, '特色 2｜冻干与全预混', ['结论一：全预混 2–8℃ 保存 12 个月', '结论二：常温 6 小时性能不变（模拟运输）', '结论三：37℃ / 50℃ 加速条件可评估（按项目定）'], '冻干是宝锐最容易被记住的差异点，建议现场给样品实物。', 1.8),
 ('03 四个特色能力', 23, '特色 3｜NA 控制', ['结论：NA 残留 <8×10⁻⁴', '手段：NA 级货号 + 出库质量标准 + 16S/18S 监测模型', '下一步：与 NGS 对标的对照数据（【待补：指标与时间点】）'], '报证类客户最关心这页，讲清"我们怎么证明"。', 1.5),
 ('03 四个特色能力', 24, '特色 4｜抗抑制与复杂样本', ['结论：粪便直扩（裂解液 pH≈11）、全血、尿液场景可跑通', '手段：耐抑制酶筛选 + Mg²⁺ 条件优化 + 扩增程序协同', '适用：动物诊断、宠物/畜牧、基层快检'], '', 1.4),
 # 04 产品矩阵
 ('04 产品矩阵（货号级）', 25, '章节页 04 · 产品矩阵', ['按体系选型，直接对应测试；完整清单见《产品推荐清单》'], '', 0.3),
 ('04 产品矩阵（货号级）', 26, '产品全景（861 个在售 SKU）', ['按 BOM 组分形态分类：单组份 / 二组分 / 三组分 / 四组分 / 五组分', '另有：宝锐成品、预冻干试剂、科研产品线', '选型逻辑：先定形态，再定性能，最后定货号'], '不要念表，讲"你这种情况选哪一类"。', 1.2),
 ('04 产品矩阵（货号级）', 27, '核心酶（客户自配体系）', ['反转录酶：E12（Celerscript RTase）、E13-1000 / E29（Neoscript RTase 系列）', 'DNA 聚合酶：E02-10-NA（Taq）、E03-25-NA（HS Taq）、E07-NA（Superstart Taq plus）、E16-NA（Robustart Taq）', '均提供 NA 级版本，适配 NA 控制要求'], '自配体系客户重点看这页，直接给货号。', 1.4),
 ('04 产品矩阵（货号级）', 28, '快速 qPCR / qRT-PCR 预混', ['DNA：FM2181-4-NA（2×）、FM0181-4-NA（10×）', 'RNA：FM5134、FM5181-4-NA（5×）系列', '形态：液体 / 全预混 / 冻干球可选'], '', 1.4),
 ('04 产品矩阵（货号级）', 29, '直扩 · Lamp · 冻干', ['直扩：F3KI09（5× Fast Direct RT Premix-UNG）、2FMD021（Hyperstart Direct Premix-UNG）', 'Lamp：FHW1007-P01（Lamp Premix Plus）', '冻干/预冻干：FM513-007702-FP 等'], '冻干/免提取项目客户看的重点页。', 1.4),
 ('04 产品矩阵（货号级）', 30, '辅助与耗材', ['AS01 乙酰化 BSA、AS02 T4 Gene 32 Protein、AS05 RNase Inhibitor', 'AS17 全血释放剂、AS114-T4 核酸释放剂等', '按体系配套提供，减少客户筛料成本'], '', 0.9),
 ('04 产品矩阵（货号级）', 31, '验证结论摘要（结论级）', ['快速：≤20 min 扩增 ｜ 全预混：2–8℃ 12 个月', 'NA 控制：残留 <8×10⁻⁴ ｜ 抗抑制：复杂样本可用', '声明：原始曲线与匿名客户数据在技术交流环节提供'], '这一页是"留证据"页，讲完把资料留给客户。', 0.7),
 # 05 合作
 ('05 怎么合作', 32, '章节页 05 · 怎么合作', ['选一种开始，不用一次谈完'], '', 0.3),
 ('05 怎么合作', 33, '三种合作方式', ['① 标准品供货：按货号直接采购，常规货期', '② 委托冻干 / 定制：工艺 + 产线协同，含小批试产', '③ 联合开发：共同定义指标、共同验证，适合报证项目'], '让客户做选择题：我们从哪一种开始？', 1.2),
 ('05 怎么合作', 34, '4 步走通', ['① 需求确认 → ② 样品测试（寄样 + 测试方案同步）', '③ 小批验证（小批试产 + 稳定性）→ ④ 量产 / 委托 / 联合开发', '可承诺：样品 3 个工作日内寄出（【待补：是否可承诺】）'], '', 0.9),
 ('05 怎么合作', 35, '结语 + 联系方式 + 三码', ['下一步动作：寄样 / 约技术会 / 发推荐清单', '扫码关注公众号、小红书、视频号；加微信直接对接', '公司信息：电话 / 邮箱 / 网址 / 地址'], '收口必做：当场确认下一步动作与对接人。', 0.6),
]

CSS = """
:root{--blue:#0043C1;--navy:#002D80;--lt:#E8F0FE;--ink:#1A1A2E;--gray:#6B7280;--line:#D9E2F3}
*{box-sizing:border-box}
body{margin:0;background:#f4f7fc;font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB",sans-serif;color:var(--ink)}
.page{max-width:1080px;margin:0 auto;background:#fff;box-shadow:0 4px 28px rgba(0,43,120,.10)}
.top{display:flex;align-items:center;justify-content:space-between;padding:14px 34px;border-bottom:3px solid var(--blue)}
.top img{height:44px}
.top .slogan{color:var(--blue);font-weight:800;letter-spacing:1px;font-size:15px}
.hero{background:linear-gradient(135deg,#0A1628,#002D80);color:#fff;padding:38px 34px 30px}
.hero h1{margin:0 0 10px;font-size:32px;letter-spacing:1px}
.hero .sub{color:#93C5FD;font-size:15px}
.hero .meta{margin-top:18px;display:flex;gap:10px;flex-wrap:wrap}
.hero .meta span{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);border-radius:20px;padding:5px 14px;font-size:13px}
.body{padding:26px 34px 10px}
.warn{background:#FFF4E5;border:1px solid #F5C26B;border-left:5px solid #E37400;border-radius:8px;padding:14px 18px;margin-bottom:22px}
.warn b{color:#B45309}
.warn ul{margin:8px 0 0;padding-left:20px;line-height:1.7;font-size:13.5px;color:#7C4A03}
.toc{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:24px}
.toc div{background:var(--lt);border-radius:8px;padding:10px 12px;font-size:13px;font-weight:700;color:var(--navy)}
.toc div small{display:block;font-weight:400;color:var(--gray);margin-top:3px}
h2.ch{margin:30px 0 12px;font-size:19px;color:var(--navy);border-left:6px solid var(--blue);padding-left:12px}
h2.ch small{font-weight:400;color:var(--gray);font-size:13px;margin-left:8px}
.pg{display:flex;gap:14px;border:1px solid var(--line);border-radius:10px;padding:13px 16px;margin-bottom:9px;background:#fff}
.pg .no{flex:0 0 46px;height:46px;border-radius:9px;background:var(--blue);color:#fff;font-weight:800;font-size:17px;display:flex;align-items:center;justify-content:center}
.pg .main{flex:1}
.pg .t{font-weight:800;font-size:15px;color:var(--navy);margin-bottom:5px}
.pg ul{margin:0;padding-left:18px;font-size:13.2px;line-height:1.72;color:#333}
.pg .tip{margin-top:6px;font-size:12.4px;color:#0D904F}
.pg .tip:before{content:"🎤 讲法：";font-weight:700}
.pg .min{flex:0 0 58px;text-align:right;color:var(--gray);font-size:12.5px;padding-top:4px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.foot{background:linear-gradient(135deg,#0a3d62,#0060c0);color:#fff;padding:24px 34px;margin-top:26px}
.foot .cols{display:flex;justify-content:space-between;gap:22px;align-items:flex-start;flex-wrap:wrap}
.foot .qr{display:flex;gap:26px}
.foot .qr div{text-align:center}
.foot .qr img{width:88px;height:88px;background:#fff;border-radius:6px;padding:3px;display:block}
.foot .qr small{display:block;margin-top:6px;font-size:12px;opacity:.95}
.foot .info{font-size:12.5px;line-height:1.85;opacity:.96}
.foot .info b{font-size:14px}
"""

HTML = """<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>客户宣讲提纲 · 行业热点 + 宝锐特色（35 页 / 30 分钟）</title>
<script>__EDITJS__</script>
<style>__CSS__</style>
</head><body>
__TOOLBAR__
<div class="page">
  <div class="top">
    <img src="__LOGO__" alt="宝锐生物">
    <div class="slogan">守护生命健康，缔造美好生活</div>
  </div>

  <div class="hero">
    <h1>客户宣讲提纲 · 行业热点 + 宝锐特色</h1>
    <div class="sub">面向诊断原料客户（IVD 厂家研发 / 采购 / 老板）｜现场宣讲｜可直接照着做 PPT</div>
    <div class="meta">
      <span>35 页骨架</span><span>30 分钟节奏</span><span>5 个章节</span>
      <span>可露货号 + 结论级数据</span><span>不露原始曲线与客户名</span>
    </div>
  </div>

  <div class="body">
    <div class="warn">
      <b>⚠️ 交付前必须补齐的 3 处（我不编数字，留了占位）</b>
      <ul>
        <li><b>公司概况页（P16）</b>：成立时间、场地与产能、团队规模、可对外展示的资质/体系名称 —— 需你给可核实口径</li>
        <li><b>NA 控制页（P23）</b>：16S/18S 与 NGS 对标数据的指标与出结果时间点</li>
        <li><b>合作页（P34）</b>：样品寄出时效能否对外承诺（如"3 个工作日内"）</li>
      </ul>
    </div>
    <div class="toc">__TOC__</div>
    __PAGES__
  </div>

  <div class="foot">
    <div class="cols">
      <div class="info">
        <b>__COMPANY__</b><br>
        __CONTACT__
      </div>
      <div class="qr">
        <div><img src="__QRWX__" alt="宝锐公众号"><small>宝锐公众号</small></div>
        <div><img src="__QRXHS__" alt="宝锐小红书"><small>宝锐小红书</small></div>
        <div><img src="__QRSPH__" alt="宝锐视频号"><small>宝锐视频号</small></div>
      </div>
    </div>
  </div>
</div>
</body></html>
"""


def build():
    toc = ''.join('<div>%s<small>%s</small></div>' % (H.escape(c[0]), H.escape(c[1])) for c in CH)
    parts, cur = [], None
    for ch, no, title, pts, tip, mins in PAGES:
        if ch != cur:
            base = dict(CH)[ch]
            parts.append('<h2 class="ch">%s<small>%s</small></h2>' % (H.escape(ch), H.escape(base)))
            cur = ch
        lis = ''.join('<li>%s</li>' % H.escape(p) for p in pts)
        tiphtml = '<div class="tip">%s</div>' % H.escape(tip) if tip else ''
        parts.append(
            '<div class="pg"><div class="no">%d</div><div class="main">'
            '<div class="t">%s</div><ul>%s</ul>%s</div>'
            '<div class="min">%s min</div></div>'
            % (no, H.escape(title), lis, tiphtml, ('%g' % mins)))
    h = (HTML.replace('__CSS__', CSS).replace('__TOC__', toc).replace('__PAGES__', '\n'.join(parts))
             .replace('__LOGO__', LOGO).replace('__QRWX__', QR['wx']).replace('__QRXHS__', QR['xhs'])
             .replace('__QRSPH__', QR['sph']).replace('__COMPANY__', COMPANY).replace('__CONTACT__', CONTACT))
    h = apply_edit(h, ls_key='bior_ppt_outline_20260921', file_base='客户宣讲提纲_行业热点+宝锐特色_35页',
                   container='.page', hint_anchor='<div class="page">')
    h = h.replace('改完点右下角「<b>⬇ 导出 HTML</b>」', '改完点顶部工具栏「<b>⬇ 导出 HTML</b>」')  # 工具条实际在顶部
    h = h.replace('右下角', '顶部工具栏')
    assert '__LSKEY__' not in h and '__EDITCSS__' not in h and '__EDITJS__' not in h, '可编辑层未正确注入'
    io.open(OUT, 'w', encoding='utf-8').write(h)
    print('  ✅ %s (%.1f KB)' % (os.path.basename(OUT), os.path.getsize(OUT) / 1024))
    print('  页数条目: %d ｜ 三码内嵌: %d ｜ 图片总数: %d' % (len(PAGES), h.count('data:image/png;base64'), h.count('<img ')))


build()
