#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""验收课题组待补挂清单：行数 / 下拉 / 预填 / 筛选 / 导出 / 0 报错。"""
import sys
from playwright.sync_api import sync_playwright

F = ('/Users/liuxinyuan/Desktop/Hermes输出-工作类/营销活动/2026-10实验加速季/'
     '科研促销期订单_课题组待补挂清单.html')
ok = True
def chk(label, cond, detail=''):
    global ok
    print('  %s %-40s %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': 1050})
    errs = []
    pg.on('pageerror', lambda e: errs.append(str(e)))
    pg.on('dialog', lambda d: d.accept())
    pg.goto('file://' + F, wait_until='load')
    pg.wait_for_timeout(1500)
    print('① 结构')
    chk('品牌页眉/页脚', pg.evaluate("() => !!document.querySelector('.bior-header') && !!document.querySelector('.bior-footer')"))
    n = pg.evaluate("() => document.querySelectorAll('#tb tr').length")
    chk('78 行订单', n == 78, str(n))
    opts = pg.evaluate("() => document.querySelectorAll('#tb tr:first-child select option').length")
    chk('下拉含 1744+1 个选项', opts >= 1745, str(opts))
    print('\n② 预填与统计')
    done = pg.evaluate("() => document.getElementById('k_done').textContent")
    left = pg.evaluate("() => document.getElementById('k_left').textContent")
    chk('已选 6（原挂课题组的）', done == '6', 'done=%s left=%s' % (done, left))
    pre = pg.evaluate("() => [...document.querySelectorAll('#tb select')].filter(s=>s.value).map(s=>s.value)")
    chk('预填值形如「XX课题组」', all('课题组' in v for v in pre) and len(pre) == 6, str(pre[:7]))
    print('\n③ 交互：改选一行')
    pg.evaluate("""() => { const s=[...document.querySelectorAll('#tb select')].find(x=>!x.value);
        s.value='喻景权课题组'; s.dispatchEvent(new Event('change',{bubbles:true})); }""")
    pg.wait_for_timeout(600)
    chk('已选变 7', pg.evaluate("() => document.getElementById('k_done').textContent") == '7')
    print('\n④ 筛选')
    pg.fill('#q', '浙江大学')
    pg.wait_for_timeout(500)
    vis = pg.evaluate("() => document.querySelectorAll('#tb tr').length")
    chk('筛选「浙江大学」有结果', 0 < vis < 78, '%d 行' % vis)
    pg.fill('#q', '')
    pg.wait_for_timeout(400)
    print('\n⑤ 导出（本地不落盘，仅验证函数可跑）')
    pg.evaluate("() => { window.__dl=0; var o=HTMLAnchorElement.prototype.click; HTMLAnchorElement.prototype.click=function(){window.__dl++;}; }")
    pg.evaluate("() => exp()")
    pg.wait_for_timeout(800)
    out = pg.evaluate("() => document.getElementById('out').textContent")
    chk('导出回显 JSON 含 map/filled', '"map"' in out and '"filled"' in out, out[:60].replace('\n', ' '))
    chk('filled = 7', '"filled": 7' in out)
    print('\n⑥ 无 JS 错误')
    chk('0 JS 错误', len(errs) == 0, str(errs[:2]))
    pg.screenshot(path='/tmp/kt_backfill.png')
    br.close()

print('\n%s' % ('✅ 全部通过' if ok else '❌ 有失败项'))
sys.exit(0 if ok else 1)
