#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""线上 CDN 截图取证：确认用户实际看到的版式（部门表 + 下钻到销售 + 客户明细）。"""
import json
import sys
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': 1500, 'height': 1000})
    errs = []
    pg.on('pageerror', lambda e: errs.append(str(e)))
    pg.on('dialog', lambda d: d.accept())
    def handle_risk(tag):
        """腾讯云默认测试域名会弹「风险提醒」拦截页，需点「确定访问」才能进真页面。"""
        try:
            t = pg.evaluate("() => (document.body.innerText||'')")
            if '风险提醒' in pg.title() or '页面访问提示' in t:
                print('   [%s] 命中「风险提醒」拦截页 → 点「确定访问」' % tag)
                pg.click('text=确定访问')
                pg.wait_for_timeout(3000)
                return True
        except Exception as e:
            print('   [%s] 处理拦截页异常：%s' % (tag, str(e)[:60]))
        return False

    pg.goto(CDN, wait_until='domcontentloaded')
    handle_risk('首次')
    pg.evaluate("""([tk, idn]) => { localStorage.setItem('bior_auth_token', tk);
        localStorage.setItem('bior_sw_user_v2', JSON.stringify(idn)); }""", [TOKEN, IDENT])
    pg.goto(CDN, wait_until='load')
    handle_risk('带token')
    try:
        pg.wait_for_function("() => typeof render === 'function'", timeout=60000)
    except Exception as e:
        print('❗页面未完成启动：%s ｜ JS 错误=%s' % (str(e)[:60], errs[:3]))
        raise
    pg.wait_for_timeout(1500)
    pg.evaluate("""() => { window.state = window.state || {};
        window.state.user = JSON.parse(JSON.stringify(%s));
        if (typeof showApp === 'function') showApp(); }""" % json.dumps(IDENT, ensure_ascii=False))
    pg.wait_for_timeout(1500)
    pg.evaluate("() => { visitView='dept'; visitDrill={dept:'',sales:''}; visitHubState='see'; state.tab='visitStats'; render(); }")
    pg.wait_for_timeout(1200)
    pg.evaluate("() => visitSetMonth('2026-09')")
    pg.wait_for_timeout(5000)
    pg.screenshot(path='/tmp/live_p2c_dept.png')
    tot = pg.evaluate("() => (window.__vj||{}).total")
    print('线上部门表：total=%s 部门数=%s' % (tot, len(pg.evaluate("() => (window.__vj||{}).departments || []"))))
    pg.evaluate("() => visitDrillTo('销售拓展部','')")
    pg.wait_for_timeout(1200)
    pg.screenshot(path='/tmp/live_p2c_sales.png')
    top = pg.evaluate("() => { const d=(window.__vj.departments||[]).find(x=>x.dept==='销售拓展部'); return d?d.sales[0].name:null; }")
    pg.evaluate("(n) => visitDrillTo('销售拓展部', n)", top)
    pg.wait_for_timeout(1500)
    pg.evaluate("() => { const b=document.querySelector('#visitBody tbody tr button'); if(b) b.click(); }")
    pg.wait_for_timeout(1000)
    pg.screenshot(path='/tmp/live_p2c_cust.png', full_page=False)
    print('下钻销售=%s ｜ 客户行=%s ｜ JS 错误=%s' % (
        top, pg.evaluate("() => document.querySelectorAll('#visitBody tbody tr').length"), errs[:2]))
    br.close()
print('截图：/tmp/live_p2c_dept.png /tmp/live_p2c_sales.png /tmp/live_p2c_cust.png')
