# -*- coding: utf-8 -*-
"""固定任务测试：交接/软开运维按周、老大楼/新大楼/周六值班按天、市外县域不认领。输出 build/_fx_e2e.html"""
import io, os

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

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

TEST = r"""
<script>
setTimeout(function () {
  var out = [];
  function push(s) { out.push(s); }
  function search(q) {
    var oi = document.getElementById('orgInput');
    oi.value = q;
    oi.dispatchEvent(new Event('input'));
    var sug = document.getElementById('orgSug');
    if (!sug.children.length) return null;
    sug.children[0].click();
    return document.getElementById('pickedName').textContent;
  }
  try {
    var s0 = window.__PB.state();
    push('tasksN=' + s0.fixed.tasks.length);
    push('taskNames=' + s0.fixed.tasks.map(function (t) { return t.name; }).join(','));
    push('offN=' + s0.county.off.length);

    document.getElementById('btnAutoArea').click();
    var s = window.__PB.state();
    push('claimableAreas=' + (s.areas.length - s.county.off.length));
    push('areasPerPerson=' + s.people.map(function (p) { return p.areas.length; }).join(','));

    push('pickedA=' + search('拱宸桥'));
    document.getElementById('btnAddPlan').click();
    push('pickedB=' + search('富阳'));
    document.getElementById('btnAddPlan').click();
    push('plans=' + document.getElementById('planCount').textContent);

    document.getElementById('btnGen').click();
    var r = window.__PB.state().lastResult;
    push('fixedRows=' + (r.fixed || []).length);
    push('fixedRed=' + (r.fixedRed || []).length);

    // 按任务分组
    var byTask = {};
    (r.fixed || []).forEach(function (x) {
      if (!byTask[x.task]) byTask[x.task] = [];
      byTask[x.task].push(x);
    });
    Object.keys(byTask).forEach(function (k) {
      var g = byTask[k];
      push('FX ' + k + ' rows=' + g.length + ' kind=' + g[0].kind
        + ' span=' + g[0].from + '-' + g[0].to
        + ' members=' + g.map(function (x) { return x.members.join('+') || 'NONE'; }).join('|'));
    });

    // 交接和软开运维必须是整周一人
    var jt = byTask['交接'] || [], rk = byTask['软开运维'] || [];
    push('jtWholeWeek=' + (jt.length === 1 && jt[0].from === 0 && jt[0].to === 6 && jt[0].members.length === 1));
    push('rkWholeWeek=' + (rk.length === 1 && rk[0].from === 0 && rk[0].to === 6 && rk[0].members.length === 1));
    push('rkPerson=' + (rk[0] ? rk[0].members.join('') : '-'));

    // 老大楼 / 新大楼：每天各一行
    var ol = byTask['老大楼'] || [], nw = byTask['新大楼'] || [];
    push('oldDays=' + ol.map(function (x) { return x.from; }).join(','));
    push('newDays=' + nw.map(function (x) { return x.from; }).join(','));
    var oldPref = ol.map(function (x) { return x.members[0] || ''; });
    push('oldMaoxu=' + oldPref.filter(function (n) { return n === '毛晟渊' || n === '徐伟权'; }).length);
    var newMao = nw.map(function (x) { return x.members[0] || ''; });
    push('newMaoN=' + newMao.filter(function (n) { return n === '毛晟渊'; }).length);

    // 同一天不能一人两岗
    var dup = 0;
    var m = {};
    (r.fixed || []).forEach(function (x) {
      if (x.kind !== 'day') return;
      x.members.forEach(function (nm) {
        var k = x.from + '|' + nm;
        if (m[k]) dup++; else m[k] = 1;
      });
    });
    push('fixedDup=' + dup);

    // 县域机构的排班是否给了优先名单
    var fy = (r.rows || []).filter(function (x) { return x.area === '富阳辖区'; });
    push('fyRows=' + fy.length + ' fyMembers=' + fy.map(function (x) { return x.members.join('+'); }).join('|'));
    push('fyInA=' + fy.every(function (x) { return x.members.every(function (nm) { return ['黎江余', '徐伟权', '郑文斌'].indexOf(nm) >= 0; }); }));

    // 页面
    var tw = document.getElementById('resultWrap');
    push('hasFixedCard=' + (tw.textContent.indexOf('固定任务') >= 0));
    push('legendFixed=' + (tw.textContent.indexOf('需要你去协商') >= 0));
    document.querySelector('#tabbar button[data-tab="v-area"]').click();
    push('cover=' + document.getElementById('areaCover').textContent);
    push('offNote=' + String(document.getElementById('areaOffNote').textContent).replace(/\s+/g, ' ').slice(0, 160));

    document.querySelector('#tabbar button[data-tab="v-set"]').click();
    push('fixedAdminRows=' + document.querySelectorAll('#fixedAdmin [data-fxtask]').length);
    push('countyOffVal=' + document.getElementById('countyOff').value.slice(0, 60));
    push('countyAVal=' + document.getElementById('countyA').value);
    push('countyBVal=' + document.getElementById('countyB').value);

    // 关掉老大楼，看行数是否减少
    var cb = document.querySelector('#fixedAdmin [data-fxtask="fx4"] [data-fx="on"]');
    cb.checked = false;
    cb.dispatchEvent(new Event('change', { bubbles: true }));
    document.querySelector('#tabbar button[data-tab="v-plan"]').click();
    document.getElementById('btnGen').click();
    var r2 = window.__PB.state().lastResult;
    push('afterOffOld=' + (r2.fixed || []).filter(function (x) { return x.task === '老大楼'; }).length);
    push('afterOffRows=' + (r2.fixed || []).length);
  } catch (e) {
    push('ERR ' + e.message + ' @@ ' + String(e.stack).slice(0, 200));
  }
  push('ERRS=' + ((window.__ERRS || []).join(' ; ') || 'none'));
  var d = document.createElement('div');
  d.id = 'E2E';
  d.textContent = out.join(' || ');
  document.body.appendChild(d);
}, 1500);
</script>
"""

html = io.open(SRC, encoding='utf-8').read()
i = html.find('<script>window.__PAIBAN_DATA__')
assert i > 0, 'data script not found'
html = html[:i] + ERRTRAP + html[i:]
end = html.rfind('</body>')
assert end > 0
html = html[:end] + TEST + html[end:]
io.open(OUT, 'w', encoding='utf-8').write(html)
print('out=', OUT, 'size=', round(os.path.getsize(OUT) / 1024.0, 1), 'KB')
