#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""诊断：CDN 页面启动到哪一步（render 未定义是登录页还是报错）。"""
import json
from playwright.sync_api import sync_playwright

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
CDN = 'https://bier-sales-d0gatbvlx288724e9-1458438710.tcloudbaseapp.com/workbench/index.html'
sess = json.load(open(ROOT + '/数据/auth_sessions.json', encoding='utf-8'))
mine = sorted([(v['expire_at'], k, v) for k, v in sess.items() if v.get('name') == '刘新元'],
              reverse=True, key=lambda x: x[0])
TOKEN, IDENT = mine[0][1], dict(mine[0][2])
IDENT['open_id'] = 'ou_preview_only'
IDENT.pop('expire_at', None)

with sync_playwright() as p:
    br = p.chromium.launch(channel='chrome', headless=True)
    pg = br.new_page(viewport={'width': 1400, 'height': 900})
    errs, cons = [], []
    pg.on('pageerror', lambda e: errs.append(str(e)))
    pg.on('console', lambda m: cons.append('%s: %s' % (m.type, m.text[:160])))
    pg.on('requestfailed', lambda r: cons.append('FAILED %s %s' % (r.url[:90], r.failure)))
    pg.goto(CDN, wait_until='domcontentloaded')
    print('① 裸访问（无 token）')
    print('   title=%r href=%s' % (pg.title()[:40], pg.evaluate('()=>location.href')[:80]))
    print('   typeof render=%s | 有登录表单=%s' % (
        pg.evaluate('()=>typeof render'), pg.evaluate("()=>!!document.querySelector('input[type=password]')")))
    pg.evaluate("""([tk, idn]) => { localStorage.setItem('bior_auth_token', tk);
        localStorage.setItem('bior_sw_user_v2', JSON.stringify(idn)); }""", [TOKEN, IDENT])
    print('\n② 带 token 重载')
    pg.goto(CDN, wait_until='load')
    for i in range(12):
        pg.wait_for_timeout(1000)
        st = pg.evaluate("() => ({r: typeof render, s: typeof showApp, u: typeof state, t: (document.body.innerText||'').slice(0,60)})")
        print('   +%ds render=%s showApp=%s state=%s ｜ 正文=%r' % (i + 1, st['r'], st['s'], st['u'], st['t']))
        if st['r'] == 'function':
            break
    print('\n③ JS 错误（%d）' % len(errs))
    for e in errs[:4]:
        print('   ', e[:200])
    print('\n④ 控制台/失败请求（%d）' % len(cons))
    for c in cons[:8]:
        print('   ', c[:190])
    pg.screenshot(path='/tmp/diag_cdn.png')
    br.close()
