#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
工作台优化补丁（index.html + app.html 双文件）
A. Tab 分组：侧栏按「经营/客户/我的/智能」分组显示（14 个平铺 → 4 组）
B. 移动端底栏精简：固定 4 个高频 Tab + 「更多」底部抽屉（原先把 14 个全塞进底栏）
C. AI 助手移动端布局：高度扣除底栏、四步闭环+快捷任务折叠成「工具」、按钮图标化
幂等：已含 TABGROUP_V1 标记则跳过。
"""
import re
import sys

MARK = 'TABGROUP_V1'

GROUPS = [
    ('biz', '📊 经营'),
    ('cust', '👥 客户'),
    ('mine', '🧑‍💼 我的'),
    ('ai', '🤖 智能'),
]
TAB_GROUP = {
    'dashboard': 'biz', 'orders': 'biz',
    'customers': 'cust', 'groups': 'cust', 'visitPrep': 'cust',
    'oppSandbox': 'cust', 'complaints': 'cust', 'specialReq': 'cust',
    'myActivities': 'mine', 'todos': 'mine', 'testReport': 'mine', 'training': 'mine',
    'aiAssistant': 'ai', 'dataMgmt': 'ai',
}
BOTTOM_IDS = ['dashboard', 'customers', 'aiAssistant', 'todos']

CSS = '''
/* ===== 优化：Tab 分组 + 移动端体验 (TABGROUP_V1) ===== */
.nav-group{padding:12px 16px 5px;font-size:10.5px;font-weight:800;color:#94a3b8;letter-spacing:.08em}
.more-sheet{position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:900;display:none}
.more-sheet.open{display:block}
.more-sheet .panel{position:absolute;left:0;right:0;bottom:0;background:#fff;border-radius:18px 18px 0 0;
  padding:14px 16px calc(18px + env(safe-area-inset-bottom));max-height:80vh;overflow:auto;
  box-shadow:0 -8px 30px rgba(15,23,42,.18);animation:sheetUp .22s ease}
@keyframes sheetUp{from{transform:translateY(14px);opacity:.6}to{transform:translateY(0);opacity:1}}
.more-sheet .sheet-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}
.more-sheet .sheet-head b{font-size:15px}
.more-sheet .sheet-head button{border:none;background:#f1f5f9;color:#475569;border-radius:10px;
  width:30px;height:30px;font-size:15px;cursor:pointer}
.more-sheet h4{margin:14px 0 8px;font-size:11px;font-weight:800;color:#94a3b8;letter-spacing:.06em}
.more-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.more-grid button{display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 4px;
  border:1px solid var(--border);border-radius:14px;background:#fff;font-size:12px;font-weight:700;
  color:var(--text);cursor:pointer;transition:var(--trans-smooth)}
.more-grid button:active{transform:scale(.96);border-color:var(--pri);color:var(--pri)}
.more-grid button .icon{font-size:22px;line-height:1}
.ai-tools-toggle{display:none!important}
'''

CSS_MOBILE = '''
  /* 移动端：AI 助手 + 工具折叠 (TABGROUP_V1) */
  .ai-tab{height:calc(100dvh - var(--header-h) - 70px);min-height:0;border-radius:0;border-left:0;border-right:0}
  .chat-head{padding:9px 12px;gap:6px}
  .chat-head .t{font-size:13px}
  .chat-head .t .sub{display:none}
  .ai-tab .ai-hbtn{width:32px!important;height:32px!important;min-width:32px!important;padding:0!important;border-radius:9px!important;font-size:15px!important;overflow:hidden}
  .ai-tab .ai-hbtn .hbtn-t{display:none!important}
  .ai-tab .ai-hbtn.ai-tools-toggle{display:inline-flex!important;align-items:center;justify-content:center}
  .ai-tab .ai-tools{display:none}
  .ai-tab .ai-tools.open{display:block}
  .chat-msg{max-width:92%;font-size:13.5px}
  .chat-upload-hint{display:none}
  .chat-input{padding:8px 10px;gap:6px}
  .chat-input textarea{font-size:15px;min-height:40px}
  .chat-input button{min-width:64px}
'''


def patch(path):
    s = open(path, encoding='utf-8').read()
    if MARK in s:
        return '⏭ 已打过补丁，跳过：%s' % path
    orig = s

    # ── A1. TABS 加 group ──
    def add_group(m):
        tid = m.group(1)
        if 'group:' in m.group(0):
            return m.group(0)
        g = TAB_GROUP.get(tid)
        return m.group(0).replace("id: '%s'" % tid, "id: '%s', group: '%s'" % (tid, g), 1) if g else m.group(0)
    s = re.sub(r"\{\s*id:\s*'([A-Za-z]+)'[^}]*\}", add_group, s)

    # ── A2. 侧栏分组渲染 ──
    old_side = """  sidebar.innerHTML = visible.map(function(t) {
    return '<button class="nav-item' + (state.tab === t.id ? ' active' : '') + '" onclick="switchTab(\\'' + t.id + '\\')"><span class="nav-icon">' + t.icon + '</span><span class="nav-label">' + t.label + '</span></button>';
  }).join('') + '<div class="nav-divider"></div><button class="nav-item" onclick="doLogout()"><span class="nav-icon">🚪</span><span class="nav-label">退出</span></button>';"""
    new_side = """  // 侧栏按业务分组渲染（TABGROUP_V1）
  var _grp = [['biz', '📊 经营'], ['cust', '👥 客户'], ['mine', '🧑‍💼 我的'], ['ai', '🤖 智能'], ['other', '📌 其他']];
  var _btn = function(t) {
    return '<button class="nav-item' + (state.tab === t.id ? ' active' : '') + '" onclick="switchTab(\\'' + t.id + '\\')"><span class="nav-icon">' + t.icon + '</span><span class="nav-label">' + t.label + '</span></button>';
  };
  sidebar.innerHTML = _grp.map(function(g) {
    var items = visible.filter(function(t) { return (t.group || 'other') === g[0]; });
    if (!items.length) return '';
    return (g[0] === 'other' ? '' : '<div class="nav-group">' + g[1] + '</div>') + items.map(_btn).join('');
  }).join('') + '<div class="nav-divider"></div><button class="nav-item" onclick="doLogout()"><span class="nav-icon">🚪</span><span class="nav-label">退出</span></button>';"""
    assert old_side in s, '侧栏锚点未命中 ' + path
    s = s.replace(old_side, new_side, 1)

    # ── B. 底栏 4 + 更多 ──
    old_bottom = """  bottom.innerHTML = '<div class="bottom-nav">' + visible.map(function(t) {
    return '<button class="' + (state.tab === t.id ? 'active' : '') + '" onclick="switchTab(\\'' + t.id + '\\')"><span class="icon">' + t.icon + '</span><span>' + t.label + '</span></button>';
  }).join('') + '</div>';"""
    new_bottom = """  // 移动端底栏：固定 4 个高频 Tab + 「更多」抽屉（TABGROUP_V1）
  var _keep = ['dashboard', 'customers', 'aiAssistant', 'todos'];
  var _b = function(t) {
    return '<button class="' + (state.tab === t.id ? 'active' : '') + '" onclick="switchTab(\\'' + t.id + '\\')"><span class="icon">' + t.icon + '</span><span>' + t.label + '</span></button>';
  };
  var _pinned = visible.filter(function(t) { return _keep.indexOf(t.id) >= 0; });
  var _others = visible.filter(function(t) { return _keep.indexOf(t.id) < 0; });
  bottom.innerHTML = '<div class="bottom-nav">' + _pinned.map(_b).join('') +
    (_others.length ? '<button onclick="openMoreSheet()"><span class="icon">⋯</span><span>更多</span></button>' : '') +
    '</div>';
  window.__visibleTabs = visible;"""
    assert old_bottom in s, '底栏锚点未命中 ' + path
    s = s.replace(old_bottom, new_bottom, 1)

    # ── C. AI 助手：工具栏折叠 + 按钮图标化 ──
    old_head = '<div style="display:flex;gap:6px;flex-shrink:0"><button onclick="copyChatAll(this)"'
    new_head = ('<div style="display:flex;gap:6px;flex-shrink:0;align-items:center">'
                '<button class="ai-hbtn ai-tools-toggle" onclick="toggleAiTools()" title="展开工具（四步闭环/快捷任务）" '
                'style="background:rgba(255,255,255,.2);color:#fff;border:none;border-radius:9px;cursor:pointer">⚙</button>'
                '<button onclick="copyChatAll(this)"')
    assert old_head in s, 'AI 头部锚点未命中 ' + path
    s = s.replace(old_head, new_head, 1)

    for old_b, cls in (('📋 复制对话', 'ai-hbtn'), ('⭐ 归档为经验', 'ai-hbtn'), ('＋ 新建对话', 'ai-hbtn')):
        if old_b in s:
            s = s.replace(old_b, '<span class="hbtn-t">%s</span>' % old_b, 1)
    # 给三个头部按钮加 class（它们的共同前缀是 background:rgba(255,255,255,.2)/background:#fff;color:#1a56db）
    s = s.replace('style="background:rgba(255,255,255,.2);color:#fff;border:none;border-radius:14px;padding:5px 12px',
                  'class="ai-hbtn" style="background:rgba(255,255,255,.2);color:#fff;border:none;border-radius:14px;padding:5px 12px')
    s = s.replace('style="background:#fff;color:#1a56db;border:none;border-radius:14px;padding:5px 12px',
                  'class="ai-hbtn" style="background:#fff;color:#1a56db;border:none;border-radius:14px;padding:5px 12px')

    # 包住 aiStepBar + 快捷任务
    if "'<div id=\"aiStepBar\"" in s:
        s = s.replace("'<div id=\"aiStepBar\"", "'<div class=\"ai-tools\" id=\"aiTools\">' + '<div id=\"aiStepBar\"", 1)
    else:
        s = s.replace("<div id=\"aiStepBar\"", "<div class=\"ai-tools\" id=\"aiTools\"><div id=\"aiStepBar\"", 1)
    if "'<div class=\"chat-body\" id=\"aiChatBody\">'" in s:
        s = s.replace("'<div class=\"chat-body\" id=\"aiChatBody\">'",
                      "'</div>' + '<div class=\"chat-body\" id=\"aiChatBody\">'", 1)
    else:
        s = s.replace('<div class="chat-body" id="aiChatBody">',
                      '</div><div class="chat-body" id="aiChatBody">', 1)

    # ── CSS：必须追加在样式表末尾，否则会被后面的基础规则覆盖（踩过）──
    mobile = ('@media (max-width: 768px) {' + CSS_MOBILE + '}\n'
              '@media (max-width: 640px) {' + CSS_MOBILE + '}\n')
    s = s.replace('</style>', CSS + mobile + '</style>', 1)

    # ── JS：toggleAiTools + 更多抽屉 ──
    js = '''
/* ---------- 优化：AI 工具折叠 + 更多抽屉 (TABGROUP_V1) ---------- */
function toggleAiTools() {
  var e = document.getElementById('aiTools');
  if (e) e.classList.toggle('open');
}
function openMoreSheet() {
  var s = document.getElementById('moreSheet');
  if (!s) {
    s = document.createElement('div');
    s.id = 'moreSheet';
    s.className = 'more-sheet';
    s.onclick = function(ev) { if (ev.target === s) closeMoreSheet(); };
    document.body.appendChild(s);
  }
  var tabs = window.__visibleTabs || TABS;
  var grp = [['biz', '📊 经营'], ['cust', '👥 客户'], ['mine', '🧑‍💼 我的'], ['ai', '🤖 智能'], ['other', '📌 其他']];
  var html = '<div class="panel"><div class="sheet-head"><b>全部功能</b><button onclick="closeMoreSheet()">✕</button></div>';
  grp.forEach(function(g) {
    var items = tabs.filter(function(t) { return (t.group || 'other') === g[0]; });
    if (!items.length) return;
    html += '<h4>' + g[1] + '</h4><div class="more-grid">' + items.map(function(t) {
      return '<button onclick="switchTab(\\'' + t.id + '\\');closeMoreSheet()"><span class="icon">' + t.icon + '</span><span>' + t.label + '</span></button>';
    }).join('') + '</div>';
  });
  s.innerHTML = html + '</div>';
  s.classList.add('open');
}
function closeMoreSheet() {
  var s = document.getElementById('moreSheet');
  if (s) s.classList.remove('open');
}
'''
    s = s.replace('function init()', js + '\nfunction init()', 1) if 'function init()' in s else s.replace('init();', js + '\ninit();', 1)

    assert s != orig, '补丁未产生变化：' + path
    open(path, 'w', encoding='utf-8').write(s)
    return '✅ 已打补丁：%s（%d → %d 字节）' % (path, len(orig.encode()), len(s.encode()))


if __name__ == '__main__':
    for p in sys.argv[1:]:
        print(patch(p))
