# /home/jay/workspace/memory/screenshots/insuro-e2e/test_authenticated.py
from playwright.sync_api import sync_playwright
import os, json, requests

SCREENSHOT_DIR = "/home/jay/workspace/memory/screenshots/insuro-e2e"
BASE_URL = "http://127.0.0.1:5173"
SUPABASE_URL = "https://zayhfjuwviporbzokudr.supabase.co"
SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InpheWhmanV3dmlwb3Jiem9rdWRyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzMwNDY1MTksImV4cCI6MjA4ODYyMjUxOX0.aRQpYgl5ZeHxh4PTnVm_1Hwky2h83-Cb_8RGlv-xP9s"

results = []
all_console_errors = []
login_success = False

# Try Supabase REST API login
test_passwords = ["insuro2024!", "InsUr0Test!", "test1234!", "password123"]
session_data = None

for pwd in test_passwords:
    try:
        resp = requests.post(
            f"{SUPABASE_URL}/auth/v1/token?grant_type=password",
            headers={
                "apikey": SUPABASE_KEY,
                "Content-Type": "application/json"
            },
            json={"email": "drumband@gmail.com", "password": pwd},
            timeout=10
        )
        if resp.status_code == 200:
            session_data = resp.json()
            login_success = True
            print(f"Login succeeded with password attempt")
            break
        else:
            print(f"Login attempt failed: {resp.status_code} - {resp.text[:100]}")
    except Exception as e:
        print(f"Login attempt error: {e}")

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    context = browser.new_context(viewport={"width": 1280, "height": 720})
    page = context.new_page()

    # Collect console errors
    page.on("console", lambda msg: all_console_errors.append({"type": msg.type, "text": msg.text, "url": page.url}) if msg.type == "error" else None)

    if login_success and session_data:
        # Navigate to app first to set localStorage on correct domain
        page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
        page.wait_for_timeout(1000)

        # Inject Supabase session into localStorage
        storage_key = f"sb-zayhfjuwviporbzokudr-auth-token"
        storage_value = json.dumps({
            "access_token": session_data.get("access_token"),
            "refresh_token": session_data.get("refresh_token"),
            "token_type": "bearer",
            "expires_in": session_data.get("expires_in", 3600),
            "expires_at": session_data.get("expires_at"),
            "user": session_data.get("user"),
        })
        page.evaluate(f'window.localStorage.setItem("{storage_key}", JSON.stringify({storage_value}))')
        page.wait_for_timeout(500)

        # Navigate to intro to check if auth is working
        page.goto(BASE_URL + "/intro", wait_until="networkidle", timeout=15000)
        page.wait_for_timeout(3000)
        current_url = page.url

        if "/login" not in current_url:
            print("Auth session injection SUCCESSFUL - not redirected to /login")

            # === Test all flows ===

            # Flow 2: Onboarding
            page.goto(BASE_URL + "/onboarding", wait_until="networkidle", timeout=15000)
            page.wait_for_timeout(2000)
            page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-02-onboarding.png"), full_page=True)
            results.append({"path": "/onboarding", "status": "OK", "final_url": page.url, "screenshot": "auth-02-onboarding.png"})

            # Flow 3: Dashboard menus
            dashboard_pages = [
                ("/generate", "auth-03-generate.png"),
                ("/crm/dashboard", "auth-03-crm-dashboard.png"),
                ("/ai-automation", "auth-03-ai-automation.png"),
                ("/info-keyword", "auth-03-info-keyword.png"),
                ("/insuwiki-intro", "auth-03-insuwiki-intro.png"),
                ("/settings", "auth-03-settings.png"),
                ("/contents", "auth-03-contents.png"),
            ]
            for path, ss_name in dashboard_pages:
                errors_before = len(all_console_errors)
                try:
                    page.goto(BASE_URL + path, wait_until="networkidle", timeout=15000)
                    page.wait_for_timeout(2000)
                    page.screenshot(path=os.path.join(SCREENSHOT_DIR, ss_name), full_page=True)
                    new_errors = all_console_errors[errors_before:]
                    results.append({
                        "path": path, "screenshot": ss_name, "status": "OK",
                        "final_url": page.url, "console_errors": len(new_errors),
                        "error_details": [e["text"][:200] for e in new_errors]
                    })
                except Exception as e:
                    results.append({"path": path, "screenshot": ss_name, "status": "FAIL", "error": str(e)[:300]})

            # Flow 4: CRM
            crm_pages = [
                ("/crm/customers", "auth-04-crm-customers.png"),
                ("/crm/pipeline", "auth-04-crm-pipeline.png"),
                ("/crm/messenger", "auth-04-crm-messenger.png"),
            ]
            for path, ss_name in crm_pages:
                errors_before = len(all_console_errors)
                try:
                    page.goto(BASE_URL + path, wait_until="networkidle", timeout=15000)
                    page.wait_for_timeout(2000)
                    page.screenshot(path=os.path.join(SCREENSHOT_DIR, ss_name), full_page=True)
                    new_errors = all_console_errors[errors_before:]
                    # Check for specific CRM elements
                    body_text = page.inner_text("body")[:1000] if page.query_selector("body") else ""
                    results.append({
                        "path": path, "screenshot": ss_name, "status": "OK",
                        "final_url": page.url, "console_errors": len(new_errors),
                        "has_content": len(body_text) > 50,
                        "snippet": body_text[:200]
                    })
                except Exception as e:
                    results.append({"path": path, "screenshot": ss_name, "status": "FAIL", "error": str(e)[:300]})

            # Flow 5: Locked features (check if user is free plan)
            premium_pages = ["/ai-onestop", "/ai-automation", "/info-keyword"]
            for pp in premium_pages:
                try:
                    page.goto(BASE_URL + pp, wait_until="networkidle", timeout=15000)
                    page.wait_for_timeout(2000)
                    ss_name = f"auth-05-locked-{pp.replace('/', '-').strip('-')}.png"
                    page.screenshot(path=os.path.join(SCREENSHOT_DIR, ss_name), full_page=True)

                    # Check for lock-related elements
                    body_html = page.content()
                    has_lock = "Lock" in body_html or "locked" in body_html.lower() or "잠금" in body_html
                    has_upgrade_cta = "업그레이드" in body_html or "가족" in body_html or "프리미엄" in body_html or "플랜" in body_html
                    has_blur = "blur" in body_html

                    results.append({
                        "path": pp, "check": "premium_lock", "screenshot": ss_name,
                        "status": "OK", "has_lock_indicator": has_lock,
                        "has_upgrade_cta": has_upgrade_cta, "has_blur": has_blur,
                        "snippet": page.inner_text("body")[:300] if page.query_selector("body") else ""
                    })
                except Exception as e:
                    results.append({"path": pp, "check": "premium_lock", "status": "FAIL", "error": str(e)[:300]})

        else:
            print("Auth session injection FAILED - still redirected to /login")
            results.append({"auth_injection": "FAILED", "note": "Could not bypass auth guard"})
    else:
        results.append({"login": "FAILED", "note": "Could not authenticate with any test password"})

    # Flow 6: Mobile responsive (works without auth on /login page)
    context.close()
    mobile_context = browser.new_context(viewport={"width": 375, "height": 812})
    mobile_page = mobile_context.new_page()
    mobile_page.on("console", lambda msg: all_console_errors.append({"type": msg.type, "text": msg.text, "url": mobile_page.url}) if msg.type == "error" else None)

    if login_success and session_data:
        mobile_page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
        storage_key = f"sb-zayhfjuwviporbzokudr-auth-token"
        storage_value = json.dumps({
            "access_token": session_data.get("access_token"),
            "refresh_token": session_data.get("refresh_token"),
            "token_type": "bearer",
            "expires_in": session_data.get("expires_in", 3600),
            "expires_at": session_data.get("expires_at"),
            "user": session_data.get("user"),
        })
        mobile_page.evaluate(f'window.localStorage.setItem("{storage_key}", JSON.stringify({storage_value}))')

    try:
        mobile_page.goto(BASE_URL + "/intro", wait_until="networkidle", timeout=15000)
        mobile_page.wait_for_timeout(3000)

        # Check for mobile bottom nav (class contains "md:hidden" and "fixed bottom-0")
        bottom_nav = mobile_page.query_selector("nav.md\\:hidden, nav[class*='bottom'], nav[class*='fixed']")
        mobile_page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-06-mobile-intro.png"), full_page=False)

        results.append({
            "path": "/intro (mobile 375px)",
            "check": "mobile_responsive",
            "mobile_bottom_nav_found": bottom_nav is not None,
            "status": "OK",
            "final_url": mobile_page.url
        })

        # Also check /generate on mobile
        mobile_page.goto(BASE_URL + "/generate", wait_until="networkidle", timeout=15000)
        mobile_page.wait_for_timeout(2000)
        bottom_nav2 = mobile_page.query_selector("nav.md\\:hidden, nav[class*='bottom'], nav[class*='fixed']")
        mobile_page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-06-mobile-generate.png"), full_page=False)
        results.append({
            "path": "/generate (mobile 375px)",
            "check": "mobile_responsive",
            "mobile_bottom_nav_found": bottom_nav2 is not None,
            "status": "OK",
            "final_url": mobile_page.url
        })
    except Exception as e:
        results.append({"path": "/intro mobile", "status": "FAIL", "error": str(e)[:300]})

    mobile_context.close()
    browser.close()

# Save results
output = {
    "login_success": login_success,
    "results": results,
    "total_console_errors": len(all_console_errors),
    "console_errors_detail": [{"type": e["type"], "text": e["text"][:200], "url": e["url"]} for e in all_console_errors[:50]]
}
with open(os.path.join(SCREENSHOT_DIR, "results_authenticated.json"), "w") as f:
    json.dump(output, f, indent=2, ensure_ascii=False)

print(json.dumps(output, indent=2, ensure_ascii=False))
