"""階段 5a:驗證 PWA 可安裝(manifest 解析 + service worker 註冊)。"""

import asyncio
import sys
from pathlib import Path

try:
    sys.stdout.reconfigure(encoding="utf-8")
except (AttributeError, ValueError):
    pass

from playwright.async_api import async_playwright

HERE = Path(__file__).resolve().parent
PROFILE_DIR = HERE / "profile"
OUT_DIR = HERE / "out"


async def main():
    async with async_playwright() as pw:
        ctx = await pw.chromium.launch_persistent_context(
            user_data_dir=str(PROFILE_DIR / "robert"),
            headless=False,
            viewport={"width": 390, "height": 844},   # iPhone 14 Pro 尺寸
            user_agent=(
                "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) "
                "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
            ),
        )
        results = []
        try:
            page = await ctx.new_page()
            await page.goto("http://localhost:8000", wait_until="networkidle")

            # 1. manifest 連得上
            manifest = await page.evaluate("""
                async () => {
                    const link = document.querySelector('link[rel="manifest"]');
                    if (!link) return null;
                    const r = await fetch(link.href);
                    return r.ok ? await r.json() : null;
                }
            """)
            if manifest and manifest.get("name") == "Coba 庫柏":
                results.append(f"PASS: manifest OK,name={manifest['name']}, icons={len(manifest.get('icons', []))} 個")
            else:
                results.append(f"FAIL: manifest 解析失敗 → {manifest}")

            # 2. apple touch icon meta
            apple_icon = await page.locator('link[rel="apple-touch-icon"]').count()
            if apple_icon > 0:
                results.append("PASS: apple-touch-icon 連結 ✓")
            else:
                results.append("FAIL: 缺 apple-touch-icon")

            # 3. apple-mobile-web-app-capable
            cap = await page.locator('meta[name="apple-mobile-web-app-capable"][content="yes"]').count()
            if cap > 0:
                results.append("PASS: iOS 加到主畫面支援(meta)")
            else:
                results.append("FAIL: 缺 apple-mobile-web-app-capable meta")

            # 4. theme-color
            tc = await page.locator('meta[name="theme-color"]').count()
            if tc > 0:
                results.append("PASS: theme-color meta ✓")

            # 5. service worker 註冊成功(多等一下,SW 是 async)
            sw_info = None
            for i in range(10):
                await asyncio.sleep(0.6)
                sw_info = await page.evaluate("""
                    async () => {
                        if (!('serviceWorker' in navigator)) return {available: false};
                        const reg = await navigator.serviceWorker.getRegistration();
                        return {
                            available: true,
                            registered: !!reg,
                            scope: reg ? reg.scope : null,
                            state: reg && reg.active ? reg.active.state : null,
                        };
                    }
                """)
                if sw_info.get("registered"):
                    break
            if sw_info and sw_info.get("registered"):
                results.append(f"PASS: Service Worker 已註冊(state={sw_info.get('state')}) ✓")
            else:
                results.append(f"FAIL: SW 沒註冊 → {sw_info}")

            await page.screenshot(path=str(OUT_DIR / "stage_5a_pwa.png"), full_page=False)

        finally:
            await ctx.close()

        print("\n" + "=" * 60)
        print(" 階段 5a PWA 測試")
        print("=" * 60)
        for r in results:
            print(r)
        print("=" * 60)
        return 0 if all(r.startswith("PASS") for r in results) else 1


if __name__ == "__main__":
    sys.exit(asyncio.run(main()))
