#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""销售助手使用手册 v3（展示优化版 DEMO）。

改造点（相对 v2 的"流水账"）：
  ① 4 个任务入口（见客户前 / 客户当场提问 / 回来记录跟进 / 查数据做材料），替代 11 个抽象章节
  ② 卡片默认折叠：只露能力名 + 一句话；点开展开聊天气泡示范
  ③ 聊天气泡（灰泡＝你说的 / 蓝泡＝助手答）+ 每句「复制」
  ④ 顶部搜索 + 标签筛选
  ⑤ 末页「常用速查」
内容全部来自 v2 的 36 张能力卡，不新增、不改写事实。
"""
import json
import os
import re
import sys

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
sys.path.insert(0, os.path.join(ROOT, '脚本'))
import brand_kit as BK

SRC = os.path.join(ROOT, '团队共享/宝锐销售助手_使用手册.html')
OUT = os.path.join(ROOT, '团队共享/宝锐销售助手_使用手册_v3展示优化DEMO.html')

TASK_RULES = [
    ('拜访与客户', r'访前|拜访|客户背景|客户台账|客户清单|决策|关键人|联系人|课题组|时间线|复盘|客户画像'),
    ('数据与订单', r'采购|订单|价格|报价|金额|走势|同比|环比|报表|统计|销量|发货|库存|KPI|业绩'),
    ('技术与产品', r'选型|推荐|体系|配制|程序|参数|指标|排查|异常|答疑|对标|技术|货号|产品'),
    ('调研与证据', r'竞品|市场|情报|文献|证据|出处|引用|调研'),
    ('记录与材料', r'录入|记录|跟进|提醒|待办|纪要|沉淀|转写|识别|PDF|Excel|文档|图片|报告|材料|海报|单页'),
]
TAG_RULES = [
    ('数据', r'数据|采购|订单|价格|金额|走势|统计|报表'),
    ('技术', r'技术|答疑|排查|体系|程序|参数|指标|选型'),
    ('调研', r'竞品|市场|文献|调研|情报'),
    ('记录', r'记录|录入|跟进|待办|复盘|纪要|提醒'),
    ('材料', r'材料|交付|图|PDF|Excel|文档|转写|报告'),
]


def parse_v2():
    h = open(SRC, encoding='utf-8').read()
    caps = []
    # 找每个 h2 段落范围
    sec_spans = [(m.start(), m.group(1)) for m in re.finditer(r'<h2[^>]*>(.*?)</h2>', h, re.S)]
    sec_spans.append((len(h), ''))
    for i in range(len(sec_spans) - 1):
        start, title = sec_spans[i]
        end = sec_spans[i + 1][0]
        block = h[start:end]
        title_txt = re.sub(r'<[^>]+>', '', title).strip()
        for m in re.finditer(r'<div class="cap">(.*?)</div>\s*</div>\s*</div>', block, re.S):
            body = m.group(0)
            ct = re.search(r'class="ct">(.*?)</div>', body, re.S)
            q = re.search(r'class="q">(.*?)</div>', body, re.S)
            a = re.search(r'class="a">(.*?)</div>', body, re.S)
            if not ct or not q:
                continue
            caps.append({'能力': re.sub(r'<[^>]+>', '', ct.group(1)).strip(),
                         '你说': re.sub(r'<[^>]+>', '', q.group(1)).strip(),
                         '它会': re.sub(r'<[^>]+>', '', (a.group(1) if a else '')).strip(),
                         '原章节': title_txt})
    # 去重（同一能力名只留首次）
    seen, out = set(), []
    for c in caps:
        k = c['能力'] + c['你说'][:12]
        if k not in seen:
            seen.add(k)
            out.append(c)
    return out


def task_of(c):
    """按命中词数打分，取最高分（避免首条规则贪婪吞掉全部）。"""
    # 能力名权重高（3 分/词），用户问法权重低（1 分/词）；回答文本不参与（数据类词过多会带偏）
    name, q = c['能力'], c['你说']
    best, score = None, 0
    for tname, pat in TASK_RULES:
        s = 3 * len(set(re.findall(pat, name))) + len(set(re.findall(pat, q)))
        if s > score:
            best, score = tname, s
    return best or '记录与材料'


def tags_of(c):
    blob = c['能力'] + ' ' + c['你说'] + ' ' + c['它会']
    return [n for n, pat in TAG_RULES if re.search(pat, blob)] or ['技术']


def build(caps):
    tasks = ['拜访与客户', '数据与订单', '技术与产品', '调研与证据', '记录与材料']
    tags = ['数据', '技术', '调研', '记录', '材料']
    from collections import Counter
    tc = Counter(task_of(c) for c in caps)
    tg = Counter(t for c in caps for t in tags_of(c))
    cards = []
    for i, c in enumerate(caps):
        c['任务'] = task_of(c)
        c['标签'] = tags_of(c)
        cards.append({
            'i': i, 'name': c['能力'], 'task': c['任务'], 'tags': c['标签'],
            'q': c['你说'], 'a': c['它会'],
            'blob': (c['能力'] + c['你说'] + c['它会']).lower()})
    payload = json.dumps(cards, ensure_ascii=False).replace('</', '<\\/')
    chips_task = ('<button class="chip on" data-task="全部">全部 <b>%d</b></button>' % len(cards)) + \
        ''.join('<button class="chip" data-task="%s">%s <b>%d</b></button>' % (t, t, tc[t]) for t in tasks)
    chips_tag = ''.join('<button class="chip" data-tag="%s">%s</button>' % (t, t) for t in tags)
    quick = cards[:10]
    quicks = ''.join('<div class="ql" data-q="%s"><span class="qq">%s</span><button class="cp" data-c="%s">复制</button></div>'
                     % (re.sub(r'"', '&quot;', c['q']), c['q'], re.sub(r'"', '&quot;', c['q'])) for c in quick)
    now = __import__('datetime').datetime.now().strftime('%Y-%m-%d')
    return f"""<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>宝锐销售助手 · 使用手册（展示优化 DEMO）</title>
<style>
:root{{--blue:#1a5fb4;--bg:#f0f2f5;--line:#e3e8ef;--muted:#5f6b7a}}
*{{box-sizing:border-box}}
body{{margin:0;background:var(--bg);color:#1c2430;font:15px/1.65 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;display:flex;flex-direction:column;min-height:100vh}}
main{{flex:1 0 auto}}
.hero{{background:linear-gradient(135deg,#0b3d91,#1a5fb4 60%,#2b7fd4);color:#fff;padding:22px 20px 18px}}
.hero h1{{margin:0 0 6px;font-size:23px}}
.hero p{{margin:0;font-size:13px;opacity:.92}}
.wrap{{max-width:1100px;margin:0 auto;padding:0 16px 40px}}
.bar{{position:sticky;top:0;z-index:20;background:#fff;border-bottom:1px solid var(--line);padding:10px 16px;margin:0 0 14px;border-radius:0 0 12px 12px}}
.bar .inner{{max-width:1100px;margin:0 auto;display:flex;gap:10px;align-items:center;flex-wrap:wrap}}
input.s{{flex:1 1 260px;padding:9px 12px;border:1px solid var(--line);border-radius:10px;font-size:14px}}
.chip{{border:1px solid var(--line);background:#fff;color:#33415c;border-radius:999px;padding:6px 13px;font-size:13px;cursor:pointer;white-space:nowrap}}
.chip b{{color:var(--blue);font-weight:600}}
.chip.on{{background:var(--blue);border-color:var(--blue);color:#fff}}
.chip.on b{{color:#fff}}
.cnt{{font-size:12.5px;color:var(--muted);margin:8px 0 12px}}
.grid{{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}}
.c{{background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden}}
.ch{{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;padding:12px 14px;cursor:pointer}}
.ch h3{{margin:0 0 3px;font-size:15.5px;color:#12233d}}
.ch .one{{font-size:12.5px;color:var(--muted);display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}}
.arw{{color:var(--blue);font-size:13px;white-space:nowrap;padding-top:2px}}
.tgs{{margin-top:6px}}
.tg{{display:inline-block;background:#eaf3ff;color:#1a5fb4;border:1px solid #cfe3ff;border-radius:6px;padding:1px 7px;font-size:11px;margin-right:4px}}
.body{{display:none;padding:0 14px 14px;border-top:1px dashed var(--line)}}
.c.open .body{{display:block}}
.bub{{max-width:88%;padding:8px 12px;border-radius:12px;margin:9px 0;font-size:13.5px;position:relative}}
.bub.me{{background:#f1f3f6;color:#243044;margin-left:auto;border-bottom-right-radius:4px}}
.bub.ai{{background:#eaf3ff;color:#12233d;border-bottom-left-radius:4px}}
.bub .who{{font-size:11px;color:var(--muted);margin-bottom:3px}}
.cp{{border:1px solid var(--line);background:#fff;border-radius:7px;font-size:11.5px;padding:2px 8px;cursor:pointer;float:right}}
.cp:hover{{background:#f7f9fc}}
.sect{{margin:26px 0 10px;border-left:5px solid var(--blue);padding-left:11px}}
.sect h2{{margin:0;font-size:18px;color:#0b3d91}}
.sect p{{margin:2px 0 0;font-size:12.5px;color:var(--muted)}}
.ql{{background:#fff;border:1px solid var(--line);border-radius:10px;padding:9px 12px;margin:7px 0;display:flex;gap:10px;align-items:center;justify-content:space-between;font-size:13.5px}}
.qq{{color:#12233d}}
.note{{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-top:16px;font-size:13px;color:#41506b}}
@media(max-width:820px){{.grid{{grid-template-columns:1fr}}.hero h1{{font-size:20px}}}}
</style></head><body>
<div class="hero"><h1>宝锐销售助手 · 使用手册</h1>
<p>不用记功能 —— 按「你现在要干什么」找入口，点开照抄一句话发给助手就行　·　共 {len(cards)} 项能力　·　更新 {now}</p></div>
<main>
<div class="bar"><div class="inner">
  <input class="s" id="q" placeholder="搜：价格 / 选型 / 竞品 / 拜访 / 转写…">
  <span id="chips-task">{chips_task}</span>
  <span id="chips-tag">{chips_tag}</span>
</div></div>
<div class="wrap">
  <div class="cnt" id="cnt">—</div>
  <div class="grid" id="g"></div>

  <div class="sect"><h2>常用速查 · 直接抄这 10 句</h2><p>复制 → 粘到微信发给助手，改个客户名就能用</p></div>
  {quicks}

  <div class="note"><b>能做什么、不能做什么</b><br>
  · 客户清单里的数据、跟进与价格明细，助手都会按你的权限给。<br>
  · 竞品/市场调研只用公开信息；内部资料不外发。<br>
  · 需要开通新权限或调整范围，找刘新元。</div>
</div>
</main>
<script>
const D={payload};
let FT='全部', FG='';
function render(){{
  const q=document.getElementById('q').value.trim().toLowerCase();
  let n=0;
  document.getElementById('g').innerHTML=D.map(function(c){{
    if(FT!=='全部' && c.task!==FT) return '';
    if(FG && c.tags.indexOf(FG)<0) return '';
    if(q && c.blob.indexOf(q)<0) return '';
    n++;
    return '<div class="c" data-i="'+c.i+'"><div class="ch"><div><h3>'+c.name+'</h3>'
      +'<div class="one">'+c.a+'</div><div class="tgs">'+c.tags.map(function(t){{return '<span class="tg">'+t+'</span>'}}).join('')+'</div></div>'
      +'<span class="arw">展开 ▾</span></div>'
      +'<div class="body"><div class="bub me"><span class="who">你发</span>'+c.q+'</div>'
      +'<div class="bub ai"><span class="who">助手给到</span>'+c.a+'</div>'
      +'<button class="cp" data-c="'+c.q.replace(/"/g,'&quot;')+'">复制这句</button></div></div>';
  }}).join('')||'<div class="note">没有匹配的能力 —— 换个词试试，或直接问助手。</div>';
  document.getElementById('cnt').textContent='当前入口「'+FT+'」显示 '+n+' 项能力'+(FG?'（标签：'+FG+'）':'')+(q?'　搜索：'+q:'');
  document.querySelectorAll('#g .ch').forEach(function(h){{h.onclick=function(){{h.parentNode.classList.toggle('open')}}}});
  document.querySelectorAll('#g .cp,.ql .cp').forEach(function(b){{b.onclick=function(e){{
    e.stopPropagation();var t=b.getAttribute('data-c');
    (navigator.clipboard?navigator.clipboard.writeText(t):Promise.reject()).then(function(){{b.textContent='已复制 ✓';setTimeout(function(){{b.textContent=(b.classList.contains('cp')&&b.parentNode.classList.contains('ql'))?'复制':'复制这句'}},1200)}})
    .catch(function(){{var ta=document.createElement('textarea');ta.value=t;document.body.appendChild(ta);ta.select();document.execCommand('copy');ta.remove();b.textContent='已复制 ✓'}});
  }}}});
}}
document.getElementById('q').oninput=render;
document.querySelectorAll('#chips-task .chip').forEach(function(b){{b.onclick=function(){{
  document.querySelectorAll('#chips-task .chip').forEach(function(x){{x.classList.remove('on')}});
  b.classList.add('on');FT=b.getAttribute('data-task');render();}}}});
document.querySelectorAll('#chips-tag .chip').forEach(function(b){{b.onclick=function(){{
  var on=b.classList.contains('on');
  document.querySelectorAll('#chips-tag .chip').forEach(function(x){{x.classList.remove('on')}});
  if(on){{FG=''}}else{{b.classList.add('on');FG=b.getAttribute('data-tag')}}
  render();}}}});
render();
</script>
</body></html>"""


def main():
    caps = parse_v2()
    print('解析到 v2 能力卡 %d 张' % len(caps))
    html = build(caps)
    html = BK.inject(html, theme='light', tag='销售助手 · 使用手册（DEMO）',
                     footer_extra='内部资料 · 展示优化 DEMO · 供选型确认')
    chk = BK.verify(html)
    assert all(chk.values()), chk
    open(OUT, 'w', encoding='utf-8').write(html)
    from collections import Counter
    print('任务入口分布:', dict(Counter(task_of(c) for c in caps)))
    print('标签分布:', dict(Counter(t for c in caps for t in tags_of(c))))
    print('→ %s（%.0f KB）' % (OUT, os.path.getsize(OUT) / 1024.0))
    print('品牌自检:', chk)


if __name__ == '__main__':
    main()
