#!/usr/bin/env python3
from __future__ import annotations
import json, subprocess
from pathlib import Path
from weasyprint import HTML

ROOT = Path(__file__).resolve().parents[1]
QA = ROOT/'qa_screenshots'
QA.mkdir(exist_ok=True)

CARDS = [
    ('Snabbtest', 'Pass/Motion Lab', 'runtime · atlet · passvy'),
    ('Flagga fel', 'Visual review + correction', 'review · correction patch'),
    ('Rörelselogik', 'Motion trace verifier', 'trace · QA'),
    ('Specialfall', 'Special prop binding', 'prop · bar · box'),
    ('Fysiofacit', 'Physio movement blueprint', 'blueprint · skeleton target'),
    ('MediaPipe', 'MediaPipe extractor', 'landmarks · patch export'),
    ('Översikt', 'Green motion expansion', 'green list · runtime gates'),
]

def page(width:int, height:int, label:str)->str:
    cols = 1 if width < 650 else (2 if width < 980 else 3)
    cards = ''.join(f'''<article class="card"><div class="kicker">{k}</div><h2>{t}</h2><p>{tags}</p><span>Öppna labb</span></article>''' for k,t,tags in CARDS)
    return f'''<!doctype html><html lang="sv"><head><meta charset="utf-8"><style>
    @page{{size:{width}px {height}px;margin:0}}*{{box-sizing:border-box}}body{{margin:0;width:{width}px;height:{height}px;overflow:hidden;background:radial-gradient(circle at 18% 0%,#234a70,#07131f 48%,#030912);color:#edf7ff;font-family:Inter,Arial,sans-serif;padding:{24 if width<600 else 32}px}}.top{{display:flex;gap:14px;align-items:center;margin-bottom:18px}}.hamb{{width:54px;height:54px;border-radius:18px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.08);display:grid;place-items:center;font-size:26px}}.brand{{font-weight:950;letter-spacing:-.04em;font-size:24px}}.nav{{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}}.nav span{{border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.07);padding:9px 12px;border-radius:999px;font-size:13px}}.nav .active{{background:rgba(59,130,246,.35);border-color:rgba(147,197,253,.55)}}.hero{{border:1px solid rgba(125,211,252,.24);background:linear-gradient(135deg,rgba(16,38,62,.92),rgba(8,17,32,.96));border-radius:28px;padding:{20 if width<600 else 28}px;box-shadow:0 22px 70px rgba(0,0,0,.32)}}.meta{{font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:#67e8f9;font-weight:900}}h1{{font-size:{44 if width<600 else 66}px;letter-spacing:-.055em;line-height:.92;margin:8px 0 12px}}.hero p{{font-size:{15 if width<600 else 19}px;color:#bed2df;max-width:850px;margin:0}}.grid{{display:grid;grid-template-columns:repeat({cols},minmax(0,1fr));gap:12px;margin-top:16px}}.card{{min-height:{150 if width<600 else 178}px;border:1px solid rgba(125,211,252,.20);background:rgba(10,23,40,.83);border-radius:22px;padding:16px;display:grid;gap:8px;align-content:start}}.card:first-child{{background:linear-gradient(145deg,rgba(37,99,235,.35),rgba(10,23,40,.92));border-color:rgba(147,197,253,.48)}}.kicker{{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:#a7f3d0;font-weight:900}}h2{{margin:0;font-size:{17 if width<600 else 21}px;letter-spacing:-.02em}}.card p{{margin:0;color:#b8c7d6;font-size:13px}}.card span{{margin-top:auto;display:inline-flex;width:max-content;border-radius:999px;background:rgba(255,255,255,.08);padding:7px 10px;font-size:12px;font-weight:800}}.check{{margin-top:14px;border:1px solid rgba(255,255,255,.12);border-radius:22px;background:rgba(255,255,255,.06);padding:16px;color:#c8d7e4;font-size:{13 if width<600 else 15}px}}.check b{{color:#fff}}
    </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></div></div><section class="hero"><div class="meta">RC52 · {label} · Testcenter i menyn</div><h1>Testa det som ska testas</h1><p>Samlad testsida för passläge, rörelse- och bildgranskning. Testlänkarna ligger i huvudmenyn i stället för att vara gömda bakom query-parametrar.</p></section><main class="grid">{cards}</main><section class="check"><b>Snabb-runda:</b> Motion Lab → lateral-line-hops / med-ball slam / chin-up / box-jump / buddy hamstring → Visual review om något ser fel ut.</section></body></html>'''

for name,w,h in [('mobile',390,844),('ipad',820,1180),('desktop',1180,820)]:
    html_path=QA/f'rc52_{name}_static_qa.html'
    pdf_path=QA/f'rc52_{name}_static_qa.pdf'
    base=QA/f'rc52_{name}_static_qa'
    html_path.write_text(page(w,h,name), encoding='utf-8')
    HTML(filename=str(html_path), base_url=str(ROOT)).write_pdf(str(pdf_path))
    subprocess.run(['pdftoppm','-png','-singlefile','-r','150',str(pdf_path),str(base)], check=True)

report={
    'rc':'RC52',
    'scope':'Testcenter in main menu',
    'runtimeAnimationChanged':False,
    'newScreen':'testCenterScreen',
    'route':'#testcenter',
    'menuItem':'Testcenter',
    'cards':len(CARDS),
    'screenshots':['rc52_mobile_static_qa.png','rc52_ipad_static_qa.png','rc52_desktop_static_qa.png']
}
(QA/'rc52_testcenter_qa_report.json').write_text(json.dumps(report,indent=2,ensure_ascii=False), encoding='utf-8')
print(QA)
