#!/usr/bin/env python3
"""Phase 1b — Playwright-Screenshots aller Templates, 4 Viewports + Interaktions-States."""
import asyncio, os, json
from playwright.async_api import async_playwright

OUT = "/home/aria/projekte/orlando-redesign/evidence/screenshots"
os.makedirs(OUT, exist_ok=True)

VIEWPORTS = {"1440": (1440, 900), "1024": (1024, 768), "768": (768, 1024), "390": (390, 844)}

PAGES = {
    "de-home": "https://www.orlandofund.com/",
    "de-profil": "https://www.orlandofund.com/profil/",
    "de-team": "https://www.orlandofund.com/team/",
    "de-team-detail": "https://www.orlandofund.com/team/anna-billy/",
    "de-portfolio": "https://www.orlandofund.com/portfolio/",
    "de-portfolio-detail": "https://www.orlandofund.com/portfolio/bergkvist-siljan/",
    "de-aktuelles": "https://www.orlandofund.com/aktuelles/",
    "de-artikel": "https://www.orlandofund.com/aktuelles/artikel/das-war-2024-jahresrueckblick/",
    "de-verantwortung": "https://www.orlandofund.com/verantwortung/",
    "de-karriere": "https://www.orlandofund.com/karriere/",
    "de-kontakt": "https://www.orlandofund.com/kontakt/",
    "de-impressum": "https://www.orlandofund.com/impressum/",
    "de-404": "https://www.orlandofund.com/gibt-es-nicht-xyz/",
    "en-home": "https://www.orlandofund.com/en/",
    "en-team": "https://www.orlandofund.com/en/team/",
    "en-portfolio": "https://www.orlandofund.com/en/portfolio/",
    "en-news": "https://www.orlandofund.com/en/news/",
}

async def shoot(browser, name, url, vp_name, vp, log):
    ctx = await browser.new_context(viewport={"width": vp[0], "height": vp[1]},
                                    locale="de-DE",
                                    user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36 OrlandoAudit")
    page = await ctx.new_page()
    try:
        await page.goto(url, wait_until="networkidle", timeout=45000)
        # Cookie-Banner: erst mit Banner schießen (nur 1440), dann wegklicken
        if vp_name == "1440":
            await page.screenshot(path=f"{OUT}/{name}__{vp_name}__cookiebanner.png", full_page=False)
        # Usercentrics: Accept klicken (Shadow DOM)
        try:
            await page.evaluate("""() => {
                const root = document.querySelector('#usercentrics-root');
                if (root && root.shadowRoot) {
                    const btn = root.shadowRoot.querySelector('[data-testid="uc-accept-all-button"]');
                    if (btn) btn.click();
                }
            }""")
            await page.wait_for_timeout(1500)
        except Exception: pass
        await page.mouse.wheel(0, 300); await page.wait_for_timeout(400)
        await page.mouse.wheel(0, -300); await page.wait_for_timeout(400)
        await page.screenshot(path=f"{OUT}/{name}__{vp_name}__full.png", full_page=True)
        log[f"{name}__{vp_name}"] = "ok"
    except Exception as e:
        log[f"{name}__{vp_name}"] = f"ERR {str(e)[:120]}"
    finally:
        await ctx.close()

async def states(browser, log):
    """Interaktions-States auf Desktop + Mobile-Menü."""
    ctx = await browser.new_context(viewport={"width": 1440, "height": 900})
    page = await ctx.new_page()
    try:
        await page.goto("https://www.orlandofund.com/", wait_until="networkidle", timeout=45000)
        try:
            await page.evaluate("""() => {
                const root = document.querySelector('#usercentrics-root');
                if (root && root.shadowRoot) {
                    const btn = root.shadowRoot.querySelector('[data-testid="uc-accept-all-button"]');
                    if (btn) btn.click();
                }
            }""")
            await page.wait_for_timeout(1200)
        except Exception: pass
        # Sticky header nach Scroll
        await page.mouse.wheel(0, 900); await page.wait_for_timeout(600)
        await page.screenshot(path=f"{OUT}/state__header-scrolled__1440.png")
        await page.mouse.wheel(0, -900); await page.wait_for_timeout(400)
        # Sprachumschalter öffnen
        try:
            sw = page.locator("text=DE").first
            await sw.click(timeout=3000); await page.wait_for_timeout(500)
            await page.screenshot(path=f"{OUT}/state__lang-switcher__1440.png")
            log["lang-switcher"] = "ok"
        except Exception as e:
            log["lang-switcher"] = f"ERR {str(e)[:80]}"
        # Team-Seite: Hover auf Karte + Fokus-State
        await page.goto("https://www.orlandofund.com/team/", wait_until="networkidle", timeout=45000)
        try:
            card = page.locator("a[href*='/team/']").nth(3)
            await card.hover(); await page.wait_for_timeout(400)
            await page.screenshot(path=f"{OUT}/state__team-hover__1440.png")
            log["team-hover"] = "ok"
        except Exception as e:
            log["team-hover"] = f"ERR {str(e)[:80]}"
        await page.keyboard.press("Tab"); await page.keyboard.press("Tab"); await page.keyboard.press("Tab")
        await page.screenshot(path=f"{OUT}/state__team-focus__1440.png")
        # Verantwortung: Akkordeons öffnen
        await page.goto("https://www.orlandofund.com/verantwortung/", wait_until="networkidle", timeout=45000)
        try:
            acc = page.locator("button, .accordion, [aria-expanded]").first
            await acc.click(timeout=3000); await page.wait_for_timeout(500)
            await page.screenshot(path=f"{OUT}/state__esg-accordion__1440.png", full_page=True)
            log["esg-accordion"] = "ok"
        except Exception as e:
            log["esg-accordion"] = f"ERR {str(e)[:80]}"
    finally:
        await ctx.close()
    # Mobile-Menü
    ctx = await browser.new_context(viewport={"width": 390, "height": 844}, is_mobile=True, has_touch=True)
    page = await ctx.new_page()
    try:
        await page.goto("https://www.orlandofund.com/", wait_until="networkidle", timeout=45000)
        try:
            await page.evaluate("""() => {
                const root = document.querySelector('#usercentrics-root');
                if (root && root.shadowRoot) {
                    const btn = root.shadowRoot.querySelector('[data-testid="uc-accept-all-button"]');
                    if (btn) btn.click();
                }
            }""")
            await page.wait_for_timeout(1200)
        except Exception: pass
        try:
            burger = page.locator("button[aria-label*='enu'], .burger, .hamburger, [class*='burger'], [class*='menu-toggle'], nav button").first
            await burger.click(timeout=4000); await page.wait_for_timeout(700)
            await page.screenshot(path=f"{OUT}/state__mobile-menu__390.png", full_page=False)
            log["mobile-menu"] = "ok"
        except Exception as e:
            log["mobile-menu"] = f"ERR {str(e)[:80]}"
    finally:
        await ctx.close()

async def main():
    log = {}
    async with async_playwright() as pw:
        browser = await pw.chromium.launch()
        for vp_name, vp in VIEWPORTS.items():
            for name, url in PAGES.items():
                await shoot(browser, name, url, vp_name, vp, log)
        await states(browser, log)
        await browser.close()
    with open(f"{OUT}/_log.json", "w") as f:
        json.dump(log, f, indent=1)
    errs = {k: v for k, v in log.items() if v != "ok"}
    print(f"DONE shots={len(log)} errors={len(errs)}")
    for k, v in errs.items(): print(" ", k, v)

asyncio.run(main())
