import io, os, sys

SRC = r"D:\workbbbbbb\排班工具.html"
OUT = r"D:\workbbbbbb\build\_x_e2e.html"

ERRTRAP = '<script>window.__ERRS=[];window.addEventListener("error",function(e){window.__ERRS.push((e.message||"")+" @line"+e.lineno);});</script>'

TEST = r'''<div id="E2E">PENDING</div>
<script>
(function(){
  var done=false;
  function out(t){var d=document.getElementById('E2E');if(d)d.textContent=t;}
  function b64(u8){
    var s='',ch=0x8000;
    for(var i=0;i<u8.length;i+=ch){s+=String.fromCharCode.apply(null,u8.subarray(i,i+ch));}
    return btoa(s);
  }
  function run(){
    if(done)return;done=true;
    try{
      var PB=window.__PB;
      var rows=PB.peopleRows();
      var bin=PB.buildXlsx(rows);
      var res=[];
      res.push('rowsN='+rows.length);
      res.push('colsN='+rows[0].length);
      res.push('head='+rows[0].join('|'));
      res.push('xlsxLen='+bin.length);
      res.push('magic='+bin[0]+','+bin[1]+','+bin[2]+','+bin[3]);
      res.push('stateText='+(document.getElementById('xlsxState')||{}).textContent);
      res.push('hintHasPath=('+String((document.getElementById('xlsxHint')||{}).textContent).indexOf('人员信息表.xlsx')+'>=0)');
      res.push('syncBtn='+!!document.getElementById('btnSyncXlsx'));
      res.push('BASE64:'+b64(bin));
      res.push('ERRS='+((window.__ERRS||[]).join(' ; ')||'none'));
      out(res.join(' || '));
    }catch(err){
      out('ERR '+(err&&err.message)+' @@ '+(err&&err.stack||'').slice(0,300));
    }
  }
  if(document.readyState==='complete'){setTimeout(run,300);}
  else{window.addEventListener('load',function(){setTimeout(run,300);});}
  setTimeout(run,4000);
})();
</script>'''

html = io.open(SRC, encoding='utf-8').read()
i = html.find('<script>window.__PAIBAN_DATA__')
html = html[:i] + ERRTRAP + html[i:]
end = html.rfind('</body>')
html = html[:end] + TEST + html[end:]
io.open(OUT, 'w', encoding='utf-8').write(html)
print('ok ->', OUT, len(html))
