#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""P0 回归：改动只该影响「待办」，其余 Tab 必须照常渲染。

枚举页面自身 TABS 列表逐个切，记录每个 Tab 的渲染体量，任何 JS 错误即失败。
"""
import json
import os
import sys
from playwright.sync_api import sync_playwright

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
BASE = 'http://127.0.0.1:8765/'
USER = '刘新元'

ok = True
def chk(label, cond, detail=''):
    global ok
    print('  %s %-34s %s' % ('✅' if cond else '❌', label, detail))
    if not cond:
        ok = False

with sync_playwright() as p:
    br = p.chromium.launch(channel='chrome', headless=True)
    pg = br.new_page(viewport={'width': 1500, 'height': 1000})
    errs = []
    pg.on('pageerror', lambda e: errs.append(str(e)))
    pg.on('dialog', lambda d: d.accept())

    pg.goto(BASE, wait_until='domcontentloaded')
    pg.evaluate("""([u]) => {
        localStorage.setItem('bior_auth_token', 'preview-only-token');
        localStorage.setItem('bior_sw_user_v2', JSON.stringify({name:u, role:'admin', dept:'营销中心', line:'diag', open_id:'ou_preview_only'}));
    }""", [USER])
    pg.goto(BASE + '工具/index.html', wait_until='load')
    pg.wait_for_timeout(2500)
    pg.evaluate("""([u]) => {
        window.state = window.state || {};
        window.state.user = {name:u, role:'admin', dept:'营销中心', line:'diag', open_id:'ou_preview_only'};
        if (typeof showApp === 'function') showApp();
    }""", [USER])
    pg.wait_for_timeout(1500)

    tabs = pg.evaluate("() => (window.TABS || []).map(t => t.id)")
    print('页面共 %d 个 Tab：%s\n' % (len(tabs), tabs))

    res = []
    for t in tabs:
        n0 = len(errs)
        pg.evaluate("(t) => { try { switchTab(t); } catch(e) { window.__tabErr = String(e); } }", t)
        pg.wait_for_timeout(700)
        info = pg.evaluate("""(t) => ({
            len: (document.getElementById('main') || {}).innerText ? document.getElementById('main').innerText.replace(/\\s+/g,' ').trim().length : -1,
            cards: document.querySelectorAll('#main .card').length,
            err: window.__tabErr || ''
        })""", t)
        res.append((t, info, len(errs) - n0))
        pg.evaluate("() => { window.__tabErr = ''; }")

    print('逐 Tab 渲染：')
    for t, info, de in res:
        flag = '✅' if (info['err'] == '' and info['len'] > 40 and de == 0) else '❌'
        if flag == '❌':
            ok = False
        print('  %s %-16s 文本 %5d 字符 | 卡片 %2d | 新增错误 %d %s'
              % (flag, t, info['len'], info['cards'], de, ('| ' + info['err'][:60]) if info['err'] else ''))

    # 待办 Tab 复检（改动集中区）
    pg.evaluate("() => switchTab('todos')")
    pg.wait_for_timeout(1200)
    td = pg.evaluate("""() => ({
        hasForm: !!document.getElementById('todoCat'),
        opts: (() => { const s = document.getElementById('todoCat'); return s ? s.querySelectorAll('option').length : 0; })(),
        filters: [...document.querySelectorAll('.todo-filters button')].length
    })""")
    chk('待办 Tab 复检', td['hasForm'] and td['opts'] == 9 and td['filters'] >= 5, json.dumps(td, ensure_ascii=False))
    chk('全程无 JS 错误', not errs, str(errs[:2]))
    br.close()

print('\n%s' % ('✅ P0 回归通过：其余 Tab 未受影响' if ok else '❌ 回归发现问题'))
sys.exit(0 if ok else 1)
