#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""P1 真实用户路径验证：在工作台外壳里切到「活动录入」Tab，
读 **iframe 内部** 是否已是新版（活动形式 / 关联订单 / 待办确认）。
"""
import json
import sys
from playwright.sync_api import sync_playwright

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
BASE = 'http://127.0.0.1:8765/'
USER = '刘新元'
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') == USER], 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)

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("""([tk, idn]) => {
        localStorage.setItem('bior_auth_token', tk);
        localStorage.setItem('bior_sw_user_v2', JSON.stringify(idn));
    }""", [TOKEN, IDENT])
    pg.goto(BASE + '工具/index.html', wait_until='load')
    pg.wait_for_timeout(2500)
    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(1000)
    pg.evaluate("() => { if (typeof loadData === 'function') loadData(); }")
    for _ in range(20):
        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

    pg.evaluate("() => switchTab('activityEntry')")
    pg.wait_for_timeout(3500)
    src = pg.evaluate("() => { const f = document.querySelector('#main iframe'); return f ? f.getAttribute('src') : ''; }")
    chk('iframe 已挂载且版本号已升', '20261007p1' in (src or ''), src)

    # 读 iframe 内部（同源）
    fr = None
    for f in pg.frames:
        if '20261007p1' in (f.url or ''):
            fr = f
            break
    chk('取得 iframe 上下文', fr is not None, (fr.url[:70] if fr else ''))
    if fr:
        pg.wait_for_timeout(1200)
        m = fr.evaluate("""() => {
          const c = document.getElementById('channel');
          return {ch: !!c, opts: c ? [...c.querySelectorAll('option')].map(o=>o.value) : [],
                  ordRef: !!document.getElementById('ordRefQ'),
                  cardT: !!document.getElementById('cardTodo'),
                  host: !!document.getElementById('todoConfirmHost'),
                  genBtn: typeof genTodoDrafts, draftId: (window.ST && ST.draftId) || ''};
        }""")
        chk('iframe 内有活动形式下拉', m['ch'] and set(m['opts']) == {'', 'offline', 'online'}, str(m['opts']))
        chk('iframe 内有关联订单', m['ordRef'])
        chk('iframe 内有待办确认卡+生成函数', m['cardT'] and m['host'] and m['genBtn'] == 'function')
        chk('iframe 内有会话 draftId', bool(m['draftId']), m['draftId'])
    chk('无 JS 错误', not errs, str(errs[:2]))
    br.close()

print('\n%s' % ('✅ 真实用户路径（外壳 → iframe）已是新版' if ok else '❌ 存在问题'))
sys.exit(0 if ok else 1)
