# -*- coding: utf-8 -*-
"""PAD 端 14 项修改（APK 内置版 + 后台预览版同步）
 1 首页去掉 机密★★ 与 本机PAD-xx 提示
 2 首页会议名称：方正小标宋简体 二号
 3 设置里去掉「会议类型」
 4 水印默认关闭
 5 真机顶部状态栏遮挡设置按钮（原生侧加状态栏留白）
 6 设置→关闭→进入系统 提示无数据（switchMeeting 打坏 ST.meet，已硬化）
 7 退出不再删除数据包，只回首页
 8 处室页去掉"上会干部xx人、分x个处室报送"
 9 处室卡片去掉"上会x人/材料齐全"，改"进入查看"，去掉右上返回首页
 10 任免文件页去掉"共x人…"提示、议题顺序按钮、上一条/下一条（改为直接滑动）
 11 任免文件里姓名后的 拟任/拟免 去掉
 12 详情页去掉副标题（处室·顺序·批注数）、删除批注模块、表题不吸顶
 13 干部任免审批表：宋体加粗、字距正常
 14 兼容 2000×1200（首页元素按高度封顶）
"""
import re, shutil, time, sys

FILES = [
    ('/data/www/files/rmsys-app/android/app/src/main/assets/web/pad.html', 'apk'),
    ('/data/www/files/rmsys-app/backend/src/Rmsys.Api/wwwroot/pad.html', 'web'),
]

def strip_fn(s, name):
    """按大括号配对切掉整个 function name(){...}，返回 (new_s, removed_len)"""
    m = re.search(r'function\s+' + re.escape(name) + r'\s*\([^)]*\)\s*\{', s)
    if not m:
        return s, 0
    i = m.end() - 1
    depth = 0
    while i < len(s):
        if s[i] == '{':
            depth += 1
        elif s[i] == '}':
            depth -= 1
            if depth == 0:
                i += 1
                break
        i += 1
    # 连带后面的换行
    if i < len(s) and s[i] == '\n':
        i += 1
    return s[:m.start()] + s[i:], i - m.start()

ITEMS = [
    # ---------- 1) 首页：去掉机密标签与本机提示 ----------
    ('首页-机密标签(HTML)',
     '      <div class="home-secret" id="homeSecret">机密 ★★</div>\n', ''),
    ('首页-本机提示(HTML)',
     '      <div class="home-tip">本机 <span id="homePad">PAD-07</span> · 仅限本次会议现场查阅</div>\n', ''),
    ('首页-机密标签(CSS)',
     """.home-secret{
  display:inline-flex;align-items:center;gap:8px;border:1px solid var(--gold);
  background:#FBF4E0;color:#8E6F14;border-radius:20px;
  padding:calc(4px * var(--fs)) calc(16px * var(--fs));font-size:calc(14px * var(--fs));font-weight:700;letter-spacing:1px;
}
""", ''),
    ('首页-本机提示(CSS)',
     """.home-tip{
  position:absolute;bottom:calc(16px * var(--fs));left:0;right:0;
  font-size:calc(13px * var(--fs));color:var(--ink3);letter-spacing:1px;text-align:center;
}
""", ''),

    # ---------- 2) 首页会议名称：方正小标宋简体 二号 ----------
    ('首页-会议名称字体',
     """.home-meet{
  font-size:calc(52px * var(--fs));font-weight:800;color:var(--red-deep);
  letter-spacing:calc(5px * var(--fs));line-height:1.35;text-align:center;
}""",
     """.home-meet{
  /* 会议名称：与公文标题一致 —— 方正小标宋简体，二号（22pt ≈ 29.3px） */
  font-family:'方正小标宋简体','FZXiaoBiaoSong-B05S','STZhongsong','SimSun','宋体',serif;
  font-size:calc(29.3px * var(--fs));font-weight:400;color:var(--red-deep);
  letter-spacing:calc(2px * var(--fs));line-height:1.5;text-align:center;
}"""),

    # ---------- 13) 干部任免审批表：宋体加粗、字距正常 ----------
    ('审批表-表题字体',
     """.t30-title{
  text-align:center;font-size:calc(60px * var(--s));font-weight:400;
  letter-spacing:calc(28px * var(--s));text-indent:calc(28px * var(--s));
  margin:0 auto calc(18px * var(--s)) auto;width:calc(1185px * var(--s));
  /* 表题吸顶：23 行 A4 表在平板上要滚动翻阅，滚到中段仍能看到「干部任免审批表」 */
  position:sticky;top:calc(-1 * var(--sp,26px));z-index:6;background:#fff;
  padding-top:calc(6px * var(--s));padding-bottom:calc(4px * var(--s));
  box-shadow:0 6px 10px -8px rgba(0,0,0,.28);
  color:#000;font-family:'SimSun','宋体','Songti SC',serif;
}""",
     """.t30-title{
  /* 与《干部任免审批表》原件一致：宋体加粗、字距正常；不吸顶，随页面一起滚动 */
  text-align:center;font-size:calc(46px * var(--s));font-weight:700;
  letter-spacing:calc(4px * var(--s));text-indent:0;
  margin:0 auto calc(16px * var(--s)) auto;width:calc(1185px * var(--s));
  color:#000;font-family:'SimSun','宋体','Songti SC',serif;
}"""),

    # ---------- 14) 2000×1200 兼容 ----------
    ('大屏适配',
     """@media (min-width:1700px){
  :root{--fs:1.10;}
  .paper,.doc-page{max-width:1360px;}
  .p-main{padding-left:calc(40px * var(--fs));padding-right:calc(40px * var(--fs));}
}""",
     """@media (min-width:1700px){
  :root{--fs:1.04;}
  .paper,.doc-page{max-width:1360px;}
  .p-main{padding-left:calc(40px * var(--fs));padding-right:calc(40px * var(--fs));}
}
/* 2000×1200 这类"宽而矮"的横屏平板：首页元素按屏幕高度封顶，避免按钮过大 */
@media (min-width:1800px) and (max-height:1300px){
  :root{--fs:1;}
  .home-body{gap:calc(22px * var(--fs));}
  .home-meet{font-size:calc(29.3px * var(--fs));}
  .enter-btn{width:min(440px,46%);min-height:calc(64px * var(--fs));font-size:calc(22px * var(--fs));letter-spacing:calc(4px * var(--fs));}
  .home-date{font-size:calc(19px * var(--fs));}
}"""),

    # ---------- 8)+9) 处室选择页 ----------
    ('处室页-右上返回首页',
     "      <button class=\"hbtn\" onclick=\"showPage('pg-home')\">返回首页</button>\n", ''),
    ('处室页-顶部人数提示',
     '        <span style="font-size:calc(17px * var(--fs));color:var(--ink2);">本次部务会上会干部共 <b id="deptTotal">12</b> 人，分 <b id="deptCount">3</b> 个处室报送</span>\n', ''),
    ('处室页-渲染去掉计数',
     """function renderDepts(){
  $('deptMeet').textContent=MEETINGS[ST.meet].name;
  $('deptTotal').textContent=CADRES.length;
  $('deptCount').textContent=DEPTS.length;
  var html='';""",
     """function renderDepts(){
  $('deptMeet').textContent=MEETINGS[ST.meet].name;
  var html='';"""),
    ('处室卡片-去掉人数/齐全',
     """    var cs=CADRES.filter(function(c){ return c.dept===d.k; });
    var lacks=cs.filter(function(c){ return !!c.lack; });
""", ''),
    ('处室卡片-进入查看',
     """       +  '<div class="dm"><span class="chip">上会 '+cs.length+' 人</span>'
       +  (lacks.length>0 ? '<span class="chip warn">'+lacks.length+' 人材料待补</span>' : '<span class="chip ok">材料齐全</span>')
       +  '</div>'
       +  '<div class="dgo">进入任免文件查看 &rsaquo;</div>'""",
     """       +  '<div class="dgo">进入查看 &rsaquo;</div>'"""),

    # ---------- 10) 任免文件页 ----------
    ('任免文件-顶部人数提示',
     '        <span style="font-size:calc(17px * var(--fs));color:var(--ink2);">共 <b id="fileCnt">5</b> 人 · 点击姓名查看任免审批表</span>\n', ''),
    ('任免文件-议题顺序按钮',
     "        <button class=\"tb-btn\" onclick=\"setView('list')\" id=\"vbtn-list\">议题顺序</button>\n", ''),
    ('任免文件-上一条下一条',
     """      <button class="fbtn" onclick="filePrev()">上一条</button>
      <button class="fbtn" onclick="fileNext()">下一条</button>
""", ''),
    ('任免文件-渲染去掉计数',
     """  $('fileCnt').textContent=list.length;
  $('vbtn-issue').className = 'tb-btn'+(ST.view==='issue'?' live':'');
  $('vbtn-list').className  = 'tb-btn'+(ST.view==='list'?' live':'');""",
     """  $('vbtn-issue').className = 'tb-btn'+(ST.view==='issue'?' live':'');"""),
    ('任免文件-底部说明段',
     """  html += '<p style="text-indent:0;font-size:calc(18px * var(--fs));color:#555;margin-top:calc(20px * var(--fs));">'
    + '（说明：名单中姓名为可点击项，点击可直接查看该同志《干部任免审批表》。本页共 '
    + list.length + ' 人，序号与上会审议顺序一致。）</p>';
""", ),

    # ---------- 11) 姓名后的 拟任/拟免 ----------
    ('任免文件-去掉拟任拟免变量',
     """    var flag = c.proposed ? '<span class="nm-flag r">拟任</span>' : '<span class="nm-flag g">拟免</span>';
    var role = c.proposed || ('免去'+c.current+'职务');""",
     """    var role = c.proposed || ('免去'+c.current+'职务');"""),
    ('任免文件-去掉拟任拟免标记',
     """      + '<span class="nm" onclick="openCadreById('+c.id+')">'+c.name+'</span>'+flag""",
     """      + '<span class="nm" onclick="openCadreById('+c.id+')">'+c.name+'</span>'"""),

    # ---------- 12) 详情页副标题 / 批注模块 ----------
    ('详情页-去掉副标题渲染',
     "  $('dtSub').textContent=(MEETINGS[ST.meet].depts?deptName(c.dept)+' · ':'')+'上会顺序 '+(l.indexOf(c)+1)+' / '+l.length+(c.notes&&c.notes.length?' · 含批注 '+c.notes.length+' 条':'');",
     "  /* 详情页不再显示「处室 · 上会顺序 · 含批注」副标题 */"),
    ('详情页-去掉副标题DOM',
     '        <div class="dt-sub" id="dtSub">干部一处 · 上会顺序 1</div>\n', ''),
    ('审批表-删除批注模块',
     """  if(c.notes && c.notes.length){
    h+='<div class="notes-wrap"><div class="notes-title">'
      + '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:1em;height:1em;"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>'
      + '批注信息（' + c.notes.length + ' 条）</div>'
      + c.notes.map(function(n){
          return '<div class="note"><div class="nh"><span>'+esc(n.by)+'</span><span>'+esc(n.at)+'</span>'
               + (n.field?('<span style="color:#A8171C;">【'+esc(n.field)+'】</span>'):'')+'</div>'
               + '<div class="nt">'+esc(n.text)+'</div></div>';
        }).join('')
      + '</div>';
  } else {
    h+='<div class="notes-wrap"><div class="notes-title">批注信息</div><div class="empty">本表暂无批注</div></div>';
  }
""", ''),

    # ---------- 3) 设置里去掉会议类型 ----------
    ('设置-去掉会议类型',
     """        <div class="field">
          <label>会议类型</label>
          <div class="ctl seg" id="segMeet">
            <button data-v="buwu" class="on" onclick="switchMeeting('buwu')">部务会</button>
            <button data-v="changwei" onclick="switchMeeting('changwei')">常委会</button>
            <button data-v="shuji" onclick="switchMeeting('shuji')">书记专题会</button>
          </div>
        </div>
""", ''),

    # ---------- 4) 水印默认关闭 ----------
    ('水印-默认档位',
     """              <button data-v="1" class="on" onclick="setWm(1)">开启</button>
              <button data-v="0" onclick="setWm(0)">关闭</button>""",
     """              <button data-v="1" onclick="setWm(1)">开启</button>
              <button data-v="0" class="on" onclick="setWm(0)">关闭</button>"""),
    ('水印-初始状态',
     "  wm:1,",
     "  wm:0,          /* 水印默认关闭：需要时在「设置」里开启 */"),

    # ---------- 6) switchMeeting 硬化 + 去掉 homeSecret ----------
    ('初始化-去掉机密赋值',
     "  $('homeSecret').textContent=m.secret;\n", ''),
    ('切换会议-硬化',
     """function switchMeeting(k){
  ST.meet=k;
  ST.sel = MEETINGS[k].depts ? 'yichu' : 'all';
  var m=MEETINGS[k];
  $('homeMeet').textContent=m.name;
  $('homeDate').textContent=fmtCN(new Date());
  $('homeSecret').textContent=m.secret;
  document.querySelectorAll('#segMeet button').forEach(function(b){ b.classList.toggle('on', b.getAttribute('data-v')===k); });""",
     """function switchMeeting(k){
  /* 包内只有本次会议：切到不存在的类型时保持原状，绝不改坏 ST.meet，
     否则随后的「进入系统」会被误判为无数据 */
  var m=MEETINGS[k];
  if(!m || !m.name){ toast('本机只有本次会议的数据，无法切换会议类型'); return; }
  ST.meet=k;
  ST.sel = m.depts ? 'yichu' : 'all';
  $('homeMeet').textContent=m.name;
  $('homeDate').textContent=fmtCN(new Date());"""),
]

NEW_DOEXIT = """function doExit(){
  /* 退出只回首页，不删除数据包：以导入的包为准，由干部科手动清理 */
  log('退出到首页（不删除数据包）');
  showPage('pg-home');
}
"""

def run():
    for path, tag in FILES:
        s0 = open(path, encoding='utf-8').read()
        s = s0
        applied, skipped = [], []

        # 单条替换
        for item in ITEMS:
            label, old = item[0], item[1]
            new = item[2] if len(item) > 2 else ''
            if old in s:
                s = s.replace(old, new, 1)
                applied.append(label)
            else:
                skipped.append(label)

        # 退出：整体替换 doExit（原地插回，避免锚点缺失导致函数丢失）
        s1, n1 = strip_fn(s, 'doExit')
        if n1:
            pos = s.find('function doExit')
            s = s1
            s = s[:pos] + NEW_DOEXIT + s[pos:]
            applied.append('退出-改为回首页')
        else:
            skipped.append('退出-改为回首页')

        if tag == 'apk':
            for fn in ('askExit', 'doExitNow'):
                s, n = strip_fn(s, fn)
                if n:
                    applied.append('删除 ' + fn + '()')
            s = s.replace("if(bx) bx.addEventListener('click', function(e){ e.preventDefault(); askExit(); });",
                          "if(bx) bx.addEventListener('click', function(e){ e.preventDefault(); doExit(); });", 1)

        shutil.copy2(path, path + '.bak13.' + time.strftime('%H%M%S'))
        open(path, 'w', encoding='utf-8').write(s)
        print("=== %s ===" % tag)
        print("  已改 %d 项；跳过 %d 项" % (len(applied), len(skipped)))
        if skipped:
            print("  跳过：" + '、'.join(skipped))
        print("  体积 %d → %d 字节" % (len(s0), len(s)))

run()
