#!/usr/bin/env python3
"""Phase 1c — Performance-Messung repräsentativer Templates (LCP, CLS, TTFB, Transfer)."""
import asyncio, json
from playwright.async_api import async_playwright

PAGES = {
    "de-home": "https://www.orlandofund.com/",
    "de-team": "https://www.orlandofund.com/team/",
    "de-portfolio": "https://www.orlandofund.com/portfolio/",
    "de-artikel": "https://www.orlandofund.com/aktuelles/artikel/das-war-2024-jahresrueckblick/",
    "de-verantwortung": "https://www.orlandofund.com/verantwortung/",
}

PERF_JS = """() => new Promise(resolve => {
  const out = {};
  const nav = performance.getEntriesByType('navigation')[0];
  out.ttfb = nav ? nav.responseStart : null;
  out.domContentLoaded = nav ? nav.domContentLoadedEventEnd : null;
  out.load = nav ? nav.loadEventEnd : null;
  out.transferSize = nav ? nav.transferSize : null;
  const res = performance.getEntriesByType('resource');
  out.requests = res.length;
  out.totalTransfer = res.reduce((s, r) => s + (r.transferSize || 0), 0) + (out.transferSize || 0);
  out.imgTransfer = res.filter(r => r.initiatorType === 'img').reduce((s, r) => s + (r.transferSize || 0), 0);
  out.jsTransfer = res.filter(r => r.initiatorType === 'script').reduce((s, r) => s + (r.transferSize || 0), 0);
  let lcp = null, cls = 0;
  try {
    new PerformanceObserver(l => { const e = l.getEntries(); if (e.length) lcp = e[e.length-1].startTime; })
      .observe({type: 'largest-contentful-paint', buffered: true});
    new PerformanceObserver(l => { for (const e of l.getEntries()) if (!e.hadRecentInput) cls += e.value; })
      .observe({type: 'layout-shift', buffered: true});
  } catch(e) {}
  setTimeout(() => { out.lcp = lcp; out.cls = Math.round(cls*1000)/1000; resolve(out); }, 3000);
})"""

async def main():
    results = {}
    async with async_playwright() as pw:
        browser = await pw.chromium.launch()
        for name, url in PAGES.items():
            # Kaltstart pro Seite: neuer Context, gedrosseltes Netz simuliert Realbedingungen nicht exakt,
            # daher ungedrosselt messen und als Best-Case dokumentieren
            ctx = await browser.new_context(viewport={"width": 1440, "height": 900})
            page = await ctx.new_page()
            try:
                await page.goto(url, wait_until="load", timeout=60000)
                m = await page.evaluate(PERF_JS)
                results[name] = m
            except Exception as e:
                results[name] = {"error": str(e)[:200]}
            await ctx.close()
        await browser.close()
    with open("/home/aria/projekte/orlando-redesign/evidence/audits/perf-lab.json", "w") as f:
        json.dump(results, f, indent=1)
    for k, v in results.items():
        if "error" in v: print(k, "ERR", v["error"]); continue
        print(f"{k}: TTFB={v['ttfb']:.0f}ms LCP={v['lcp'] and round(v['lcp']) or '?'}ms CLS={v['cls']} "
              f"Requests={v['requests']} Transfer={v['totalTransfer']//1024}KB (img={v['imgTransfer']//1024}KB js={v['jsTransfer']//1024}KB)")

asyncio.run(main())
