from pathlib import Path
import subprocess, json
OUT=Path('qa_screenshots'); OUT.mkdir(exist_ok=True)
VIEWPORTS={
  'mobile':(390,844),
  'ipad':(820,1180),
  'desktop':(1440,960),
}
CARDS=[
 ('Release guard','Dev release status','RC49 accepted runtime base · no broad runtime activation'),
 ('Snabbtest','Pass/Motion Lab','Live-vyn med virtuell atlet och passkontroller'),
 ('Flagga fel','Visual review + correction','Frame-för-frame flaggning av fot, riktning, ankare'),
 ('Rörelselogik','Motion trace verifier','PoseKeys, ankare, timing, pathT och confidence'),
 ('Specialfall','Special prop binding','Medball, box, bar/chin och buddy hamstring'),
 ('Video → skelett','Video / Screen Pose Capture','Lokal mp4 eller screen capture till skeleton JSON'),
]

def html(label,w,h):
    grid=''.join(f'<article class="card"><div class="k">{k}</div><h2>{t}</h2><p>{p}</p><button>Öppna</button></article>' for k,t,p in CARDS)
    return f'''<!doctype html><html><head><meta charset="utf-8"><style>@page{{size:{w}px {h}px;margin:0}}*{{box-sizing:border-box}}body{{margin:0;font-family:system-ui,-apple-system,Segoe UI,sans-serif;background:radial-gradient(circle at 8% 0,#173f61,#07111f 56%,#02060d);color:#eef4ff;padding:22px}}.top{{display:flex;align-items:center;gap:12px;margin-bottom:16px}}.hamb{{width:48px;height:48px;border:1px solid rgba(120,233,255,.32);border-radius:18px;display:grid;place-items:center}}.brand{{font-weight:950;letter-spacing:.08em;white-space:nowrap}}.nav{{margin-left:auto;display:flex;gap:9px;color:#bdefff;flex-wrap:wrap;justify-content:flex-end}}.nav span{{border:1px solid rgba(120,233,255,.22);border-radius:999px;padding:8px 11px}}.nav .active{{background:#76e8ff;color:#031323}}.dev{{background:rgba(255,196,72,.18)!important;border-color:rgba(255,196,72,.4)!important;color:#ffd777!important}}.hero,.guard,.check{{border:1px solid rgba(120,233,255,.24);background:rgba(255,255,255,.055);border-radius:22px;padding:20px;margin-bottom:14px}}.guard{{border-color:rgba(255,196,72,.36);background:rgba(255,196,72,.11)}}.meta{{color:#76e8ff;font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:12px}}h1{{font-size:clamp(34px,5.5vw,68px);line-height:.92;margin:8px 0}}p{{color:#bfd3df;line-height:1.4}}.status{{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:14px}}.pill{{border:1px solid rgba(255,255,255,.10);border-radius:18px;background:rgba(0,0,0,.22);padding:14px}}.pill b{{display:block;font-size:19px;margin-top:4px}}.grid{{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}}.card{{border:1px solid rgba(120,233,255,.20);background:rgba(255,255,255,.052);border-radius:18px;padding:16px;min-height:178px;display:grid;gap:8px}}.card:first-child{{outline:3px solid rgba(255,196,72,.30)}}.k{{color:#76e8ff;font-weight:900;font-size:12px;text-transform:uppercase}}h2{{margin:0}}button{{background:#76e8ff;border:0;border-radius:999px;padding:10px 14px;font-weight:950;color:#031323;align-self:end}}.check{{margin-top:16px}}@media(max-width:700px){{body{{padding:14px}}.nav{{display:none}}.brand{{font-size:17px}}.status{{grid-template-columns:1fr}}.grid{{grid-template-columns:1fr}}button{{width:100%}}}}</style></head><body><div class="top"><div class="hamb">☰</div><div class="brand">NEXT Athlete OS</div><div class="nav"><span>Dashboard</span><span>Övningar</span><span class="active">Testcenter</span><span class="dev">DEV</span></div></div><section class="hero"><div class="meta">RC53 · {label} · Dev/Testcenter</div><h1>Testa det som ska testas</h1><p>Samlad testsida med release guard, rollback-info, review-holds och alla labbar på ett ställe.</p></section><section class="guard"><b>Utvecklingsläge.</b> RC49 är senast visuellt accepterad runtime-bas. RC50–RC53 är review/test/verktyg ovanpå.</section><section class="status"><div class="pill"><span>Runtime-bas</span><b>RC49 accepterad</b></div><div class="pill"><span>Aktuell gren</span><b>RC53 stabilisering</b></div><div class="pill"><span>Spärr</span><b>Ingen bred aktivering</b></div></section><main class="grid">{grid}</main><section class="check"><b>Snabb-runda:</b> Release status → Motion Lab → lateral-line-hops / med-ball slam / chin-up / box-jump / buddy hamstring → Visual review vid fel.</section></body></html>'''

report={'rendered':[]}
for name,(w,h) in VIEWPORTS.items():
    html_path=OUT/f'rc53_{name}_static_qa.html'
    pdf_path=OUT/f'rc53_{name}_static_qa.pdf'
    png_prefix=OUT/f'rc53_{name}_static_qa'
    png_path=OUT/f'rc53_{name}_static_qa.png'
    html_path.write_text(html(name,w,h),encoding='utf-8')
    subprocess.run(['weasyprint',str(html_path),str(pdf_path)],check=True)
    subprocess.run(['pdftoppm','-png','-singlefile',str(pdf_path),str(png_prefix)],check=True)
    report['rendered'].append({'viewport':name,'size':[w,h],'png':str(png_path)})
(OUT/'rc53_static_qa_report.json').write_text(json.dumps(report,indent=2),encoding='utf-8')
print(json.dumps(report,indent=2))
