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

ROOT = Path(__file__).resolve().parents[1]
DATA = ROOT/'assets/data/image-admin'
QA = ROOT/'qa_screenshots'
QA.mkdir(exist_ok=True)
manifest = json.load(open(DATA/'rc50_visual_review_manifest.json'))
counts = manifest['summary']['counts']
recommended = [e for e in manifest['exercises'] if e['reviewRecommended']][:6]

def html(width, height, name):
    cards = ''.join(f'''
    <div class="row"><div><b>{e['label']}</b><code>{e['exerciseKey']}</code></div><div><span class="chip warn">{e['runtimeGate']}</span><span class="chip">{e['frameCount']} frames</span><span class="chip ok">{e['mediapipeActiveFrames']} MP active</span></div></div>
    ''' for e in recommended)
    metrics = ''.join(f'<div class="metric"><b>{v}</b><span>{k}</span></div>' for k,v in {
        'Exercises': counts['exercises'], 'Frames': counts['frames'], 'Review recommended': counts['reviewRecommendedExercises'], 'Runtime changed': 'No', 'MP active frame entries': counts['mediapipeActiveFrameEntries'], 'Missing poseKeys': counts['missingPoseKeys']
    }.items())
    return f'''<!doctype html><html><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;background:radial-gradient(circle at top left,#143b52,#06131f 55%,#03101a);font-family:Inter,Arial,sans-serif;color:#effcff;padding:28px;overflow:hidden}}.hero,.panel{{border:1px solid rgba(125,211,252,.24);background:rgba(13,38,54,.78);border-radius:24px;padding:22px;box-shadow:0 18px 60px rgba(0,0,0,.22)}}.eyebrow{{color:#67e8f9;font-size:12px;letter-spacing:.16em;text-transform:uppercase;font-weight:900}}h1{{font-size:{'44' if width<600 else '74'}px;line-height:.9;letter-spacing:-.05em;margin:8px 0 10px}}p{{font-size:18px;color:#b8d2dd;max-width:950px}}.metrics{{display:grid;grid-template-columns:repeat({'2' if width<700 else '3'},1fr);gap:10px;margin-top:16px}}.metric{{border:1px solid rgba(125,211,252,.18);border-radius:16px;background:rgba(8,25,38,.7);padding:14px}}.metric b{{display:block;font-size:30px;color:#86efac}}.metric span{{font-size:12px;color:#a8c6d3}}.panel{{margin-top:18px}}h2{{margin:0 0 10px;font-size:24px}}.row{{display:grid;grid-template-columns:{'1fr' if width<700 else '1fr 1fr'};gap:10px;border:1px solid rgba(125,211,252,.17);background:rgba(16,47,66,.48);border-radius:16px;padding:14px;margin:9px 0}}code{{display:block;color:#dffbff;background:rgba(0,0,0,.22);padding:4px 6px;border-radius:6px;margin-top:4px;font-size:12px}}.chip{{display:inline-block;border:1px solid rgba(125,211,252,.25);border-radius:999px;padding:5px 8px;margin:2px 3px;color:#dffbff;font-size:12px;font-weight:800}}.chip.warn{{color:#fbbf24;border-color:rgba(251,191,36,.4)}}.chip.ok{{color:#86efac;border-color:rgba(134,239,172,.4)}}
    </style></head><body><section class="hero"><div class="eyebrow">NEXT Pose Atlas · RC50 · {name}</div><h1>Visual Review + Correction Mode</h1><p>Review-only layer on accepted RC49 base. Flags wrong foot/hand, direction, anchor, image candidate, needs-new-pose or hold without touching runtime.</p><div class="metrics">{metrics}</div></section><section class="panel"><h2>Review recommended first</h2>{cards}</section></body></html>'''

for name,w,h in [('mobile',390,844),('ipad',820,1180),('desktop',1180,820)]:
    html_path=QA/f'rc50_{name}_static_qa.html'
    pdf_path=QA/f'rc50_{name}_static_qa.pdf'
    png_base=QA/f'rc50_{name}_static_qa'
    png_path=QA/f'rc50_{name}_static_qa.png'
    html_path.write_text(html(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(png_base)], check=True)
print(QA)
