#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""需求变更：用「逐月拆分」替代老「看板」——保留 Tab id=dashboard / label=看板，
渲染内容换成三部门逐月拆分 iframe；删除重复的 sandept Tab；老 renderDashboard 保留不调用。
精确锚点 str.find/str.replace，不做正则。"""
import os, sys

W = os.path.expanduser('~/Desktop/Hermes输出-工作类')
FILES = [os.path.join(W, '工具/index.html'), os.path.join(W, '工具/app.html')]
fails = []

TAB_OLD = "  { id: 'sandept', group: 'biz', label: '逐月拆分', icon: '\\U0001F4C8', lines: ['da','ls'] },\n"
TAB_ALT = None  # 实际文件里 icon 是字面量 emoji，见下方自适应探测

SWITCH_OLD = ("    case 'dashboard': renderDashboard(main); break;\n"
              "    case 'sandept': renderSandept(main); break;\n")
SWITCH_NEW = ("    // 「看板」Tab：2026-10-06 起内容 = 三部门逐月拆分看板（iframe 加载 工具/仪表盘/三部门逐月拆分_demo.html）。\n"
              "    // 老的 renderDashboard()/KPI 看板代码保留（数据管道不动），只是不再由 Tab 调用。\n"
              "    case 'dashboard': renderSandept(main); break;\n")

CMT_OLD = """/* ===== 三部门逐月拆分（工作台内嵌看板 · SANDPT_TAB_V1）=====
   内嵌 iframe 承载 工具/仪表盘/三部门逐月拆分_demo.html；身份经 URL 参数透传（子页 file:// 下拿不到登录态）。 */"""
CMT_NEW = """/* ===== 「看板」Tab（工作台内嵌看板 · KANBAN_TAB_V1）=====
   2026-10-06 起「看板」(id=dashboard) 的内容 = 三部门逐月拆分看板：
   内嵌 iframe 承载 工具/仪表盘/三部门逐月拆分_demo.html；身份经 URL 参数透传（子页 file:// 下拿不到登录态）。
   权限说明：renderNav 对 dashboard 是特殊判断 `if (t.id === 'dashboard') return !!tabs.dashboard;`
            —— 看板必须被显式勾选才可见；其余 Tab 缺省可见，只有显式 0/false 才隐藏。 */"""

H2_OLD = r"""'<h2 style="font-size:20px;font-weight:900;margin:0">\U0001F4C8 三部门逐月拆分</h2>' +"""
H2_NEW = """'<h2 style="font-size:20px;font-weight:900;margin:0">📊 看板</h2>' +"""

REFRESH_OLD = r"""'onclick="renderSandept(document.getElementById(\'main\'))">\U0001F504 刷新</button>' +"""
REFRESH_NEW = """'onclick="renderSandept(document.getElementById(\\'main\\'))">🔄 刷新</button>' +"""

TITLE_OLD = '\'style="width:100%;height:100%;border:none" title="三部门逐月拆分"></iframe>\''
TITLE_NEW = '\'style="width:100%;height:100%;border:none" title="看板 · 三部门逐月拆分"></iframe>\''

RENAMES = [('renderSandept', 'renderKanban'), ('sandeptUserQS', 'kanbanUserQS'),
           ('sandeptFrameSrc', 'kanbanFrameSrc'), ('sandeptFrame', 'kanbanFrame')]


def sub(s, old, new, label, cnt=1):
    n = s.count(old)
    if n != cnt:
        fails.append('%s: 命中 %d 次(期望 %d): %r' % (label, n, cnt, old[:60]))
        return s
    print('  ✓ %s' % label)
    return s.replace(old, new)


for path in FILES:
    tag = os.path.basename(path)
    s = open(path, encoding='utf-8').read()
    print('==', tag)

    # 1) 删掉重复的 sandept Tab 条目（自适应 icon 写法）
    import re
    m = re.search(r"^  \{ id: 'sandept'[^\n]*\n", s, re.M)
    if not m:
        fails.append('%s: 找不到 sandept TABS 条目' % tag)
    else:
        print('  ✓ 删除 TABS 条目: %s' % m.group(0).strip()[:70])
        s = s[:m.start()] + s[m.end():]

    # 2) switch 分支：dashboard 改渲染看板；删除 sandept 分支
    s = sub(s, SWITCH_OLD, SWITCH_NEW, '%s: switch(dashboard→看板 / 删 sandept)' % tag)

    # 3) 注释块
    s = sub(s, CMT_OLD, CMT_NEW, '%s: 函数头注释' % tag)
    # 4) 标题 + 刷新图标（原写法 \\U0001F4C8 / \\U0001F504 在 JS 里不是合法转义，会显示成 U0001F4C8）
    s = sub(s, H2_OLD, H2_NEW, '%s: h2 标题 → 📊 看板' % tag)
    s = sub(s, REFRESH_OLD, REFRESH_NEW, '%s: 刷新图标 → 🔄' % tag)
    # 5) iframe title
    if s.count(TITLE_OLD) == 1:
        s = s.replace(TITLE_OLD, TITLE_NEW)
        print('  ✓ %s: iframe title' % tag)

    # 6) 令牌改名（彻底清除 sandept 残留）
    for o, n in RENAMES:
        c = s.count(o)
        if c == 0:
            fails.append('%s: 找不到令牌 %s' % (tag, o))
            continue
        s = s.replace(o, n)
        print('  ✓ %s: %s → %s (%d 处)' % (tag, o, n, c))

    open(path, 'w', encoding='utf-8').write(s)
    print('  → 写回 %d bytes' % len(s.encode('utf-8')))

print()
if fails:
    print('❌ 失败：')
    for f in fails:
        print('   - ' + f)
    sys.exit(1)
print('✅ 完成')
