#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""定性探针：render() 在切到某些 Tab 后为何不再更新 #main。

打印原 innerHTML 片段与长度，不猜。
"""
import json
import sys
from playwright.sync_api import sync_playwright

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
BASE = 'http://127.0.0.1:8765/'
USER = '刘新元'
KEY = 'bior_sw_todos_v2_' + USER
seed = json.load(open(W + '/数据/todos.json', encoding='utf-8'))['users'][USER]

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, k, s]) => {
        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'}));
        localStorage.setItem(k, JSON.stringify(s));
    }""", [USER, KEY, seed])
    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'};
        pushTodos = function(){};
        if (typeof showApp === 'function') showApp();
    }""", [USER])
    pg.evaluate("() => { if (typeof loadData === 'function') loadData(); }")
    for _ in range(25):
        pg.wait_for_timeout(1000)
        st = pg.evaluate("() => ({l: state.loading, n: Object.keys(state.data||{}).length})")
        if st['n'] >= 8 and not st['l']:
            break

    print('main 元素数 =', pg.evaluate("() => document.querySelectorAll('#main').length"))
    for t in ['dashboard', 'customers', 'orders', 'todos', 'expense']:
        r = pg.evaluate("""(t) => {
          const before = document.getElementById('main').innerHTML.length;
          state.tab = t; render();
          const el = document.getElementById('main');
          return {tab: state.tab, before, after: el.innerHTML.length,
                  head: el.innerHTML.slice(0, 110).replace(/\\s+/g, ' '),
                  hasTodo: el.innerHTML.indexOf('待办事项') >= 0,
                  hasOrder: el.innerHTML.indexOf('订单') >= 0};
        }""", t)
        print('\n[%s]\n  innerHTML %d → %d\n  head: %s\n  含待办事项=%s 含订单=%s'
              % (t, r['before'], r['after'], r['head'], r['hasTodo'], r['hasOrder']))
    print('\nJS 错误:', errs[:3] or '无')

    pg.evaluate("() => { state.tab='todos'; render(); }")
    pg.wait_for_timeout(300)
    d = pg.evaluate("""() => ({
        todoCat: typeof window.renderTodos,
        fnErr: (() => { try { renderTodos(document.getElementById('main')); return ''; } catch(e) { return String(e); } })(),
        opts: (() => { const s=document.getElementById('todoCat'); return s?s.querySelectorAll('option').length:0; })()
    })""")
    print('直调 renderTodos：错=%r 下拉项=%d' % (d['fnErr'], d['opts']))
    br.close()
