# -*- coding: utf-8 -*-
"""把 v1 的最新 app.js 同步到 v2，再重新施加 v2 独有的「机构就近优先」差异。"""
import io
import os

V1 = r'D:\workbbbbbb\build'
V2 = r'D:\workbbbbbb\v2\build'


def rep(s, old, new, tag):
    n = s.count(old)
    if n != 1:
        raise SystemExit('REPLACE FAIL %s count=%d' % (tag, n))
    return s.replace(old, new)


src = io.open(os.path.join(V1, 'app.js'), encoding='utf-8').read()

src = rep(src, "var LS_KEY = 'paiban_state_v1';",
          "var LS_KEY = 'paiban2_near_state_v1';", 'LSKEY')

old_sort = """        cands.push({ p: p, same: pAreas(p).indexOf(target) >= 0 ? 1 : 0, d: dd, bk: Math.round(dd / 5), l: load0[p.id] || 0, pv: prefNames.length ? (pi >= 0 ? pi : 999) : 0 });
      });
      cands.sort(function (a, b) {
        if (b.same !== a.same) return b.same - a.same;
        if (a.pv !== b.pv) return a.pv - b.pv;
        if (a.l !== b.l) return a.l - b.l;
        if (a.bk !== b.bk) return a.bk - b.bk;
        return a.p.n < b.p.n ? -1 : (a.p.n > b.p.n ? 1 : 0);
      });
      var picked = [];
      cands.forEach(function (c) { if (picked.length < pl.need && c.same) picked.push(c); });
      cands.forEach(function (c) { if (picked.length < pl.need && picked.indexOf(c) < 0) picked.push(c); });"""
new_sort = """        cands.push({ p: p, same: pAreas(p).indexOf(target) >= 0 ? 1 : 0, d: dd, bk: Math.round(dd / 2), l: load0[p.id] || 0, pv: prefNames.length ? (pi >= 0 ? pi : 999) : 0 });
      });
      cands.sort(function (a, b) {
        if (a.bk !== b.bk) return a.bk - b.bk;
        if (Math.abs(a.d - b.d) > 0.05) return a.d - b.d;
        if (a.l !== b.l) return a.l - b.l;
        if (a.pv !== b.pv) return a.pv - b.pv;
        return a.p.n < b.p.n ? -1 : (a.p.n > b.p.n ? 1 : 0);
      });
      var picked = cands.slice(0, pl.need);"""
src = rep(src, old_sort, new_sort, 'SORT')

src = rep(src, """        roles: picked.map(function (c) { return c.same ? 'owner' : (deputy ? 'deputy' : 'support'); }),""",
          """        roles: picked.map(function (c) { return c.same ? 'owner' : 'near'; }),""", 'ROLES')
src = rep(src, """        deputyOf: deputy ? best.ownersHere.map(function (p) { return p.n; }).join('、') : '',""",
          """        deputyOf: '',""", 'DEPOF')

src = rep(src, """        var role = roles[i] || (x.cross.indexOf(m) >= 0 ? 'support' : 'owner');
        var st = role === 'deputy' ? 'background:#FFEFE0;color:#E06C00'
          : (role === 'support' ? 'background:#FFF6E5;color:#FA9D3B' : 'background:#E6F9EE;color:#07C160');
        var tail = role === 'deputy' ? ' 代管' : (role === 'support' ? ' 支援' : '');""",
          """        var role = roles[i] || 'near';
        var st = role === 'owner' ? 'background:#E6F9EE;color:#07C160' : 'background:#E8F1FF;color:#1D6FD0';
        var tail = role === 'owner' ? '' : ' 就近';""", 'TAG')

src = rep(src, """绿色 = 本辖区认领人；橙色 = 认领人不在岗、由就近人员代管；浅黄 = 跨辖区支援。""",
          """绿色 = 认领该辖区的本辖区人；蓝色 = 按机构就近派出（离该网点最近的人）。""", 'LEGEND')

src = rep(src, """      out.push([isFlex ? '弹性任务' : '辖区排班',""",
          """      out.push([isFlex ? '弹性任务' : '机构就近排班',""", 'TBLTYPE')
src = rep(src, """          var ro = roles[i] || (x.cross.indexOf(m) >= 0 ? 'support' : 'owner');
          return ro === 'deputy' ? m + '(代管)' : (ro === 'support' ? m + '(支援)' : m);""",
          """          var ro = roles[i] || 'near';
          return ro === 'owner' ? m + '(本辖区)' : (ro === 'near' ? m + '(就近)' : m);""", 'TBLROLE')
src = rep(src, """        x.deputyOf ? (x.deputyOf + ' 本周不在岗，由就近人员代管') : '']);""",
          """        '']);""", 'TBLNOTE')

anchor = """  /* ---- 辖区网点清单 / 按住址认领 / 联网核实 ---- */"""
rank = """  /* v2：某网点/辖区的候选排行（就近优先），供「为什么排他」自查 */
  function rankFor(code, area, day) {
    var iso = dateOfDay(day == null ? 0 : day);
    var arr = [];
    state.people.forEach(function (p) {
      if (!availableOn(p, iso)) return;
      var dd = code ? distP2O(p, code, area) : distP2A(p, area);
      arr.push({ n: p.n, d: Math.round(dd * 10) / 10, bk: Math.round(dd / 2),
        same: pAreas(p).indexOf(area) >= 0 });
    });
    arr.sort(function (a, b) {
      if (a.bk !== b.bk) return a.bk - b.bk;
      if (Math.abs(a.d - b.d) > 0.05) return a.d - b.d;
      return a.n < b.n ? -1 : (a.n > b.n ? 1 : 0);
    });
    return arr.slice(0, 5);
  }

"""
src = rep(src, anchor, rank + anchor, 'RANK')
src = rep(src, "driveMinP2O: driveMinP2O, workPts: workPts, workW: workW,",
          "driveMinP2O: driveMinP2O, workPts: workPts, workW: workW, rankFor: rankFor,", 'PB')

io.open(os.path.join(V2, 'app.js'), 'w', encoding='utf-8', newline='\n').write(src)

bh = io.open(os.path.join(V1, 'body.html'), encoding='utf-8').read()
if 'v2bar' in bh:
    raise SystemExit('body.html already has v2bar')
ano = '  </header>'
if bh.count(ano) != 1:
    raise SystemExit('header anchor count=%d' % bh.count(ano))
bar = ('  </header>' + chr(10)
       + '  <div class="v2bar">第二版 · 机构就近优先（独立项目，数据与第一版互不相通）</div>')
bh = bh.replace(ano, bar)
io.open(os.path.join(V2, 'body.html'), 'w', encoding='utf-8', newline='\n').write(bh)

print('OK v2 app.js=%d body.html=%d' % (len(src), len(bh)))
