#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""把「功能与突变位点」Tab 注入蛋白工作台 v3 → v4。"""
import json, pathlib, subprocess

ROOT = pathlib.Path('/Users/liuxinyuan/Desktop/Hermes输出-工作类')
SRC = ROOT / '工具/蛋白结构与性能工作台_v3_检索问答_20261031_V01.html'
PANEL = ROOT / '资料/protein_mutation_panel.html'
JS = ROOT / '资料/protein_mutation.js'
DATA = ROOT / '数据/protein_hotspot_data_20261031.json'
OUT = ROOT / '工具/蛋白结构与性能工作台_v4_功能与突变_20261031_V01.html'
CHECK = pathlib.Path('/Users/liuxinyuan/.hermes/profiles/zone-b/cache/scratch/mut_check.js')

html = SRC.read_text(encoding='utf-8')
panel = PANEL.read_text(encoding='utf-8')
js = JS.read_text(encoding='utf-8')
data = json.loads(DATA.read_text(encoding='utf-8'))
data_json = json.dumps(data, ensure_ascii=False, separators=(',', ':')).replace('</', '<\\/')
js = js.replace('__MUT_DATA__', data_json)

# 1) 标题 / 品牌 tag
html = html.replace('<title>蛋白结构与性能关联工作台 · 检索问答</title>',
                    '<title>蛋白结构与性能关联工作台 · 功能与突变位点</title>')
html = html.replace('蛋白结构与性能 · 4 酶 + 检索问答',
                    '蛋白结构与性能 · 4 酶 + 检索问答 + 突变')

# 2) 新 Tab 按钮
old_btn = '<button class="qbtn" id="qaTabBtn" type="button">🔎 检索问答</button>'
assert html.count(old_btn) == 1, 'qaTabBtn not unique'
new_btn = old_btn + '<button class="qbtn" id="mutTabBtn" type="button">🧬 功能与突变位点</button>'
html = html.replace(old_btn, new_btn, 1)
html = html.replace('学术检索 · Europe PMC · 摘要 / 开放获取全文摘录 · 宝锐酶映射',
                    '学术检索 · Europe PMC · 功能需求 · 热点突变 · 宝锐酶映射', 1)

# 3) 面板插在 Q&A 面板之前
marker = '<div class="panel" id="p-QA">'
assert html.count(marker) == 1, 'p-QA marker not unique'
html = html.replace(marker, panel + '\n' + marker, 1)

# 4) 脚本插在 </body> 前
assert html.count('</body>') == 1
html = html.replace('</body>', '<script>\n' + js + '\n</script>\n</body>', 1)

# 5) 自检
assert html.count('id="p-MUT"') == 1
assert html.count('id="mutTabBtn"') == 1
assert '__MUT_DATA__' not in html
assert html.count('id="p-QA"') == 1
OUT.write_text(html, encoding='utf-8')

# 6) Node 语法检查（含真实数据）
CHECK.write_text(js, encoding='utf-8')
r = subprocess.run(['node','--check',str(CHECK)], capture_output=True, text=True)
print('WROTE', OUT)
print('size MB', round(OUT.stat().st_size/1024/1024,3))
print('node', r.returncode, r.stderr[-400:])
print('counts', data['meta']['counts'])
