# -*- coding: utf-8 -*-
"""PAD 端三项修改：
 1) 应用显示名 任免上会 → 任免上会系统（Android app_name + 页面品牌兜底）
 2) 真机两侧空白：去掉 #app 1240px 定宽上限，正文纸张改为随屏宽自适应（含安全区/大屏护眼宽度）
 3) 无数据包时点「进入系统」报 Cannot read properties of undefined (reading 'depts')：
    原生桥返回 ok 但会议/名单为空、或桥未注入时，改为明确阻断页与提示，不再抛 JS 错误
"""
import re, shutil, time

BK = time.strftime('%Y%m%d%H%M%S')
PADS = ['/data/www/files/rmsys-app/android/app/src/main/assets/web/pad.html',
        '/data/www/files/rmsys-app/backend/src/Rmsys.Api/wwwroot/pad.html']
STRINGS = '/data/www/files/rmsys-app/android/app/src/main/res/values/strings.xml'

# ---------------- 1) 应用名 ----------------
s = open(STRINGS, encoding='utf-8').read()
shutil.copy2(STRINGS, STRINGS + '.bak.' + BK)
assert '<string name="app_name">任免上会</string>' in s
s = s.replace('<string name="app_name">任免上会</string>',
              '<string name="app_name">任免上会系统</string>', 1)
open(STRINGS, 'w', encoding='utf-8').write(s)
print("✓ 应用名：任免上会 → 任免上会系统")

# ---------------- 2) 自适应布局 ----------------
OLD_APP_CSS = """#app{
  max-width:1240px;margin:0 auto;height:100vh;background:var(--paper);
  display:flex;flex-direction:column;position:relative;overflow:hidden;
  box-shadow:0 0 40px rgba(0,0,0,.1);
}"""
NEW_APP_CSS = """#app{
  /* 自适应各种尺寸的平板：不再限制 1240px（真机会因此两侧留白），铺满可视区并避让刘海安全区 */
  width:100%;max-width:none;margin:0;height:100vh;height:100dvh;background:var(--paper);
  display:flex;flex-direction:column;position:relative;overflow:hidden;
  padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right);
  padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);
  box-sizing:border-box;
}"""

OLD_PAPER = """  font-family:'SimSun','宋体','Songti SC',serif;
  max-width:1000px;margin:0 auto;
}"""
NEW_PAPER = """  font-family:'SimSun','宋体','Songti SC',serif;
  /* 正文纸随屏宽自适应：窄屏铺满、宽屏控制在易读行宽内 */
  width:100%;max-width:min(1180px, 100%);margin:0 auto;
}"""

OLD_DOCPAGE = """  font-family:'SimSun','宋体','Songti SC',serif;max-width:1000px;margin:0 auto;
}"""
NEW_DOCPAGE = """  font-family:'SimSun','宋体','Songti SC',serif;width:100%;max-width:min(1180px, 100%);margin:0 auto;
}"""

ADAPTIVE_EXTRA = """
/* ===== 大屏（12.9\" iPad 横屏、安卓 2K 平板等）：略放大字号、正文纸适度加宽，避免字太小、行太长 ===== */
@media (min-width:1360px){
  :root{--fs:1.04;}
  .paper,.doc-page{max-width:1240px;}
}
@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));}
}
/* 竖屏平板（如 768×1024 / 834×1194）：正文纸铺满，去掉左右大留白 */
@media (orientation:portrait){
  .paper,.doc-page{max-width:100%;}
  .home-meet{font-size:calc(34px * var(--fs));}
}
"""

# ---------------- 3) 无数据兜底 ----------------
OLD_BOOT_TAIL = """  if(b.meetingKey && b.meeting){ MEETINGS[b.meetingKey] = b.meeting; ST.meet = b.meetingKey; }
  if(b.depts && b.depts.length){ DEPTS = b.depts; }
  if(b.cadres && b.cadres.length){ CADRES = b.cadres; }
  if(v.padNo){ ST.pad = v.padNo; }"""
NEW_BOOT_TAIL = """  if(b.meetingKey && b.meeting){ MEETINGS[b.meetingKey] = b.meeting; ST.meet = b.meetingKey; }
  if(b.depts && b.depts.length){ DEPTS = b.depts; }
  if(b.cadres && b.cadres.length){ CADRES = b.cadres; }
  if(v.padNo){ ST.pad = v.padNo; }

  /* 桥说 ok 但会议/上会名单是空的（旧包、空包、包内无本次会议）：
     直接渲染阻断页，避免首页空白后点「进入系统」抛 depts 未定义的 JS 错误 */
  var mm = MEETINGS[ST.meet];
  if(!mm || !mm.name || !CADRES.length){
    nativeBlock('EMPTY_DATA',
      '本机数据包内没有本次会议的干部名单。请让干部科重新导出数据包，'
      + '推到 Android/data/cn.haidong.zzb.rmsys/files/rmsys.pkg 后，<b>彻底关闭 App 再重新打开</b>。');
    return true;
  }"""

GUARD_FN = """
/* 兜底：任何时刻会议/名单缺失，都给明确提示，不让页面抛 JS 错误 */
function needData(){
  var m = MEETINGS[ST.meet];
  if(m && m.name && CADRES.length) return m;
  nativeBlock('NO_DATA',
    '本机尚未载入会议数据（或数据包内容为空）。请让干部科导出数据包并推送到本机后，'
    + '关闭 App 重新打开；如仍无法打开，请将设备交回干部科。');
  return null;
}
"""

OLD_ENTER = """function enterSystem(){
  if(MEETINGS[ST.meet].depts){"""
NEW_ENTER = """function enterSystem(){
  var _m = needData(); if(!_m) return;
  if(MEETINGS[ST.meet].depts){"""

OLD_INIT = """  if(bootNative()) return;
  var m=MEETINGS[ST.meet];
  $('homeMeet').textContent=m.name;"""
NEW_INIT = """  if(bootNative()) return;
  var m=MEETINGS[ST.meet];
  if(!m || !m.name){   /* 无数据：阻断页 + 明确原因，不再往下抛异常 */
    nativeBlock('NO_DATA','本机尚未载入会议数据。请让干部科导出数据包并推送到本机后，关闭 App 重新打开。');
    return;
  }
  $('homeMeet').textContent=m.name;"""

for p in PADS:
    t = open(p, encoding='utf-8').read()
    shutil.copy2(p, p + '.bak.' + BK)
    reps = [("应用容器自适应", OLD_APP_CSS, NEW_APP_CSS),
            ("正文纸自适应(.paper)", OLD_PAPER, NEW_PAPER),
            ("正文纸自适应(.doc-page)", OLD_DOCPAGE, NEW_DOCPAGE),
            ("桥返回空数据→阻断页", OLD_BOOT_TAIL, NEW_BOOT_TAIL)]
    for name, old, new in reps:
        assert t.count(old) == 1, p.split('/')[-3] + " 未命中：" + name
        t = t.replace(old, new, 1)

    # 大屏/竖屏适配块：插在现有 @media (max-width:820px) 之前
    anchor = "@media (max-width:820px){"
    assert t.count(anchor) == 1
    t = t.replace(anchor, ADAPTIVE_EXTRA.strip() + "\n\n" + anchor, 1)

    # 兜底函数 + 两处守卫
    anchor2 = "function enterSystem(){"
    assert t.count(anchor2) == 1
    t = t.replace(anchor2, GUARD_FN.strip() + "\n" + anchor2, 1)
    assert t.count(OLD_ENTER) == 1
    t = t.replace(OLD_ENTER, NEW_ENTER, 1)
    assert t.count(OLD_INIT) == 1
    t = t.replace(OLD_INIT, NEW_INIT, 1)

    open(p, 'w', encoding='utf-8').write(t)
    print("✓ 已改：", p.replace('/data/www/files/', ''))
print("\n备份后缀 .bak." + BK)
