#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""工作台增补：全屏 / 域级聚焦 + 讲解注释"""
import io
import json

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
p = W + '/脚本/build_protein_workbench_v2.py'
s = io.open(p, encoding='utf-8').read()

# 1) DOMAINS_JS 带名称与功能
s = s.replace("""        ds.append([a, b, c])""",
"""        ds.append([a, b, c, n.replace('（预测）', ''), fn])""")
s = s.replace("""    DOMAINS_JS.append('"%s":[%s]' % (p['key'], ','.join('[%d,%d,"%s"]' % tuple(x) for x in ds)))""",
"""    DOMAINS_JS.append('"%s":[%s]' % (p['key'], ','.join('[%d,%d,"%s",%s,%s]' % (
        x[0], x[1], x[2], json.dumps(x[3], ensure_ascii=False), json.dumps(x[4], ensure_ascii=False)) for x in ds)))""")

# 2) viewer 容器加全屏按钮与字幕层
s = s.replace("""        <div class="viewer" id="v-%(key)s"><div class="panlayer" id="pan-%(key)s"></div></div>""",
"""        <div class="viewer" id="v-%(key)s"><div class="panlayer" id="pan-%(key)s"></div>
          <button class="fsbtn" data-k="%(key)s" data-a="fs">⛶ 全屏</button>
          <div class="vcap" id="cap-%(key)s"></div></div>""")

# 3) 域级按钮行
s = s.replace("""          <button data-k="%(key)s" data-a="go">定位残基</button>
        </div>""",
"""          <button data-k="%(key)s" data-a="go">定位残基</button>
        </div>
        <div class="dombtns">%(dombtns)s</div>""")
s = s.replace("""        'legendbox': legendbox,""",
"""        'legendbox': legendbox, 'dombtns': dombtns,""")
s = s.replace("""    legendbox = '''""",
"""    dombtns = ''.join('<button data-k="%s" data-a="dom" data-i="%d">%s</button>' % (
        p['key'], i, n.replace('（预测）', '').replace('聚合酶域 · ', '')) for i, (n, a, b, c, fn) in enumerate(p['domains'])) + \\
        '<button data-k="%s" data-a="domall">全部结构</button>' % p['key']
    legendbox = '''""")

# 4) CSS
s = s.replace(""".panlayer{position:absolute;inset:0;display:none;cursor:grab;z-index:5}""",
""".panlayer{position:absolute;inset:0;display:none;cursor:grab;z-index:5}
.fsbtn{position:absolute;top:8px;right:8px;z-index:6;background:rgba(31,78,121,.92);color:#fff;border:none;border-radius:6px;padding:5px 10px;font-size:11.5px;cursor:pointer}
.fsbtn:hover{background:#1852B6}
.vcap{position:absolute;left:10px;right:10px;bottom:10px;z-index:6;background:rgba(31,78,121,.92);color:#fff;padding:7px 10px;border-radius:7px;font-size:11.8px;line-height:1.5;display:none}
.vcap b{color:#FFD479}
.viewer:fullscreen{height:100vh;width:100vw;background:#fff;border-radius:0}
.viewer:fullscreen .vcap{display:block;font-size:14px;padding:10px 14px}
.dombtns{display:flex;gap:6px;flex-wrap:wrap;margin-top:7px}
.dombtns button{padding:5px 10px;border:1px solid #D3E2F8;background:#F4F8FE;color:#1852B6;border-radius:14px;cursor:pointer;font-size:11.8px}
.dombtns button:hover{background:#1852B6;color:#fff;border-color:#1852B6}""")

# 5) JS：全屏 / 域聚焦 / 还原时清标记
s = s.replace("""  if(a==='reset'){ if(SAVED[k]){ v.setView(SAVED[k]); v.render(); } else { v.zoomTo(); v.render(); } }""",
"""  if(a==='reset'){
    if(SAVED[k]){ v.setView(SAVED[k]); }
    v.setStyle({},{cartoon:{colorfunc:function(x){return colorFor(k,x.resi);}}});
    v.removeAllLabels();
    var cap=document.getElementById('cap-'+k); if(cap) cap.style.display='none';
    v.render();
  }
  if(a==='fs'){
    var el=document.getElementById('v-'+k);
    if(!document.fullscreenElement){
      if(el.requestFullscreen) el.requestFullscreen();
    } else { document.exitFullscreen(); }
  }
  if(a==='dom'){
    var i=+b.dataset.i, d=DOMAINS[k][i];
    var ats=v.selectedAtoms({});
    var idx=ats.filter(function(x){return x.resi>=d[0]&&x.resi<=d[1];}).map(function(x){return x.index;});
    v.setStyle({},{cartoon:{colorfunc:function(x){return colorFor(k,x.resi);}}});
    v.removeAllLabels();
    v.addStyle({index:idx},{cartoon:{color:'#C0392B'}});
    v.zoomTo({index:idx}); v.zoom(0.9); v.render();
    var cap=document.getElementById('cap-'+k);
    if(cap){ cap.style.display='block'; cap.innerHTML='<b>'+d[3]+'（'+d[0]+'–'+d[1]+'）</b>：'+d[4]; }
    if(ats.length){ v.addLabel(d[3],{position:ats[Math.floor(ats.length/2)],backgroundColor:'#C0392B',fontColor:'white',fontSize:13,inFront:true}); v.render(); }
  }
  if(a==='domall'){
    v.setStyle({},{cartoon:{colorfunc:function(x){return colorFor(k,x.resi);}}});
    v.removeAllLabels(); v.zoomTo(); v.zoom(1.25); v.render();
    var cap=document.getElementById('cap-'+k); if(cap) cap.style.display='none';
  }""")

s = s.replace("""window.__V=V;""",
"""window.__V=V;
document.addEventListener('fullscreenchange',function(){
  var fs=!!document.fullscreenElement;
  document.querySelectorAll('.fsbtn').forEach(function(b){ b.textContent = fs?'✕ 退出全屏':'⛶ 全屏'; });
  setTimeout(function(){ Object.keys(V).forEach(function(k){ try{ V[k].resize(); V[k].render(); }catch(e){} }); },80);
});""")

io.open(p, 'w', encoding='utf-8').write(s)
print('patched')
