#!/usr/bin/env python3
from pathlib import Path
import subprocess

ROOT=Path(__file__).resolve().parents[1]
QA=ROOT/'qa_screenshots'; QA.mkdir(exist_ok=True)
VIEWS={'mobile':(390,844),'ipad':(820,1180),'desktop':(1440,900)}

def html_for(name,w,h):
    mobile=name=='mobile'
    gap=12 if mobile else 18
    pad=16 if mobile else 28
    grid='grid-template-columns:1fr;' if mobile else 'grid-template-columns:1.05fr .95fr;'
    h1=30 if mobile else 48
    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;width:{w}px;height:{h}px;overflow:hidden;font-family:Inter,Arial,sans-serif;background:radial-gradient(circle at 8% 0%,#154963,#071220 54%,#040811);color:#effbff}}
.shell{{height:100%;padding:{pad}px;display:flex;flex-direction:column;gap:{gap}px}}
.top{{display:flex;align-items:center;justify-content:space-between}}.brand{{font-weight:950;letter-spacing:.08em;font-size:{17 if mobile else 24}px}}.pill{{border:1px solid rgba(120,233,255,.42);border-radius:999px;padding:8px 12px;color:#aaf4ff;background:rgba(3,22,36,.72);font-weight:900;font-size:{10 if mobile else 13}px}}
.hero{{border:1px solid rgba(120,233,255,.22);border-radius:{20 if mobile else 30}px;background:linear-gradient(180deg,rgba(10,30,48,.72),rgba(2,8,18,.92));box-shadow:0 22px 70px rgba(0,0,0,.42);padding:{18 if mobile else 32}px}}
h1{{margin:0;font-size:{h1}px;line-height:1.02;letter-spacing:-.045em}}p{{margin:10px 0 0;color:#bdd3df;font-size:{12 if mobile else 17}px;line-height:1.42}}.grid{{display:grid;{grid}gap:{gap}px;min-height:0;flex:1}}
.card{{border:1px solid rgba(120,233,255,.18);border-radius:{18 if mobile else 25}px;background:rgba(5,15,29,.78);padding:{15 if mobile else 24}px;box-shadow:0 18px 55px rgba(0,0,0,.30);min-height:0}}
h2{{margin:0 0 10px;font-size:{19 if mobile else 28}px}}.button{{display:inline-block;margin-top:14px;background:#76e8ff;color:#031323;font-weight:950;border-radius:999px;padding:{11 if mobile else 13}px {15 if mobile else 20}px;font-size:{13 if mobile else 16}px}}
.field{{margin:12px 0;border:1px solid rgba(255,255,255,.12);border-radius:14px;padding:11px;background:rgba(255,255,255,.045);color:#cfefff;font-size:{12 if mobile else 15}px}}.path{{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#dbfbff;background:rgba(0,0,0,.23);border-radius:8px;padding:2px 5px}}
.check{{display:flex;gap:10px;margin-top:12px;font-size:{12 if mobile else 15}px;line-height:1.35;color:#e7fcff}}.check b{{color:#75eaff}}.badge{{display:inline-block;border-radius:999px;padding:7px 9px;background:rgba(120,233,255,.10);border:1px solid rgba(120,233,255,.18);font-size:{10 if mobile else 12}px;color:#c6f8ff;font-weight:800;margin:6px 6px 0 0}}
.log{{height:{115 if mobile else 205}px;margin-top:14px;border-radius:14px;background:#020811;color:#bcefff;padding:12px;font-family:ui-monospace,Menlo,monospace;font-size:{10 if mobile else 13}px;white-space:pre-wrap;overflow:hidden}}.footer{{display:{'none' if mobile else 'flex'};justify-content:space-between;color:#88a4b4;font-size:12px}}
</style></head><body><main class="shell"><div class="top"><div class="brand">NEXT ATHLETE OS</div><div class="pill">RC41 · {name} QA</div></div>
<section class="hero"><h1>MediaPipe extractor utan mappval</h1><p>RC41 löser iPhone/Safari-problemet: verktyget kan nu köra direkt mot deployade atlas-filer och sprites på nextnarvik.no. Manuell fil/mapp finns kvar som fallback.</p></section>
<section class="grid"><div class="card"><h2>Recommended: hosted auto-mode</h2><p>Öppna <span class="path">/tools/mediapipe_pose_extract_browser.html</span> och tryck:</p><div class="button">Run from deployed site</div><div class="check"><b>✓</b><span>Hämtar <span class="path">pose-atlas-packs.json</span> automatiskt.</span></div><div class="check"><b>✓</b><span>Hämtar varje sprite via atlasens <span class="path">src</span>.</span></div><div class="check"><b>✓</b><span>Exporterar samma <span class="path">rc40_mediapipe_pose_patch.json</span> som merge-scriptet redan kan läsa.</span></div><div><span class="badge">no folder picker</span><span class="badge">same merge contract</span><span class="badge">mobile visible</span></div></div>
<div class="card"><h2>Manual fallback preserved</h2><div class="field">pose-atlas-packs.json · Välj fil</div><div class="field">Sprite folder or sprite files · Välj filer</div><p>Manual mode är fortfarande bra på Mac/PC, men RC41 behöver den inte för deploy-test.</p><div class="log">Waiting…\nHosted auto-mode ready.\nAtlas path: assets/data/image-admin/pose-atlas-packs.json\nSprite source: assets/img/exercises/pose-atlas/sprites/...</div></div></section><div class="footer"><span>Static fallback render: WeasyPrint → PNG</span><span>Chromium/Playwright not used for this package QA</span></div></main></body></html>'''

for name,(w,h) in VIEWS.items():
    html=ROOT/f'qa_rc41_{name}.html'; pdf=QA/f'rc41_{name}_static_qa.pdf'; prefix=QA/f'rc41_{name}_static_qa'
    html.write_text(html_for(name,w,h),encoding='utf-8')
    subprocess.run(['weasyprint',str(html),str(pdf)],check=True,cwd=ROOT)
    subprocess.run(['pdftoppm','-png','-singlefile','-r','96',str(pdf),str(prefix)],check=True)
    print(QA/f'rc41_{name}_static_qa.png')
