# test_authenticated_v3.py — UI "이메일로 계속" 클릭 + localStorage 세션 주입 정확한 키 탐색
from playwright.sync_api import sync_playwright
import os, json, requests, time

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
auth_method = None
session_data = None

# Step 1: Try Supabase REST API login
test_passwords = ["insuro2024!", "InsUr0Test!", "test1234!", "password123"]
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
            auth_method = f"REST_API:{pwd}"
            print(f"[REST] Login succeeded: {pwd}")
            break
        else:
            print(f"[REST] Failed ({pwd}): {resp.status_code}")
    except Exception as e:
        print(f"[REST] Error: {e}")

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True, args=["--no-sandbox"])

    # ===== DESKTOP CONTEXT =====
    context = browser.new_context(viewport={"width": 1280, "height": 720})
    page = context.new_page()
    page.on("console", lambda msg: all_console_errors.append({
        "type": msg.type, "text": msg.text, "url": page.url
    }) if msg.type == "error" else None)

    # Step 2: UI login — click "이메일로 계속" first
    if not login_success:
        print("[UI] Trying UI login — clicking 이메일로 계속...")
        try:
            page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
            page.wait_for_timeout(1500)

            # Click "이메일로 계속" to reveal email/password form
            email_btn = page.query_selector('button:has-text("이메일로 계속")')
            if email_btn:
                email_btn.click()
                page.wait_for_timeout(800)
                page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-00-email-form.png"), full_page=True)
                print("[UI] Email form revealed")
            else:
                print("[UI] Could not find 이메일로 계속 button")
                # Try other selectors
                btns = page.query_selector_all("button")
                for b in btns:
                    txt = b.inner_text()
                    print(f"  Button: {txt[:50]}")

            for pwd in test_passwords:
                # Fill email
                email_input = page.query_selector('input[type="email"]')
                pwd_input = page.query_selector('input[type="password"]')

                if email_input and pwd_input:
                    page.fill('input[type="email"]', "drumband@gmail.com")
                    page.fill('input[type="password"]', pwd)

                    # Click login button
                    submit_btn = page.query_selector('button[type="submit"]')
                    if submit_btn:
                        submit_btn.click()
                        page.wait_for_timeout(3000)
                        current_url = page.url

                        if "/login" not in current_url:
                            login_success = True
                            auth_method = f"UI:{pwd}"
                            print(f"[UI] Login SUCCESS: {pwd} -> {current_url}")
                            break
                        else:
                            print(f"[UI] Login FAILED: {pwd}")
                            # re-navigate and click email form again
                            if pwd != test_passwords[-1]:
                                page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=10000)
                                page.wait_for_timeout(1000)
                                email_btn2 = page.query_selector('button:has-text("이메일로 계속")')
                                if email_btn2:
                                    email_btn2.click()
                                    page.wait_for_timeout(800)
                else:
                    print("[UI] Could not find email/password inputs")
                    break

        except Exception as e:
            print(f"[UI] Error: {e}")

    # Step 3: If REST succeeded (or UI), inject/verify session
    if login_success and session_data and "REST" in (auth_method or ""):
        # Go to /login to get the domain registered
        page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
        page.wait_for_timeout(1000)

        # Check existing localStorage keys
        existing_keys = page.evaluate("""
            () => {
                const keys = [];
                for (let i = 0; i < localStorage.length; i++) {
                    keys.push(localStorage.key(i));
                }
                return keys;
            }
        """)
        print(f"[LS] Existing localStorage keys: {existing_keys}")

        # Inject session with the standard Supabase key format
        storage_key = "sb-zayhfjuwviporbzokudr-auth-token"
        token_payload = {
            "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"""
            () => {{
                const key = "{storage_key}";
                const value = JSON.stringify({json.dumps(token_payload)});
                window.localStorage.setItem(key, value);
                console.log("Session injected:", key);
            }}
        """)
        page.wait_for_timeout(500)
        print(f"[LS] Session injected with key: {storage_key}")

    # Step 4: Navigate to /intro and check auth state
    page.goto(BASE_URL + "/intro", wait_until="networkidle", timeout=15000)
    page.wait_for_timeout(3000)
    intro_url = page.url
    auth_working = "/login" not in intro_url

    results.append({
        "check": "auth_state",
        "login_success": login_success,
        "auth_method": auth_method,
        "intro_redirected_to_login": not auth_working,
        "final_url_after_intro_nav": intro_url
    })

    if auth_working:
        print(f"[AUTH] Authenticated! Running full E2E tests...")
        page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-01-intro.png"), full_page=True)

        # 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)
        body_text = page.inner_text("body")[:500] if page.query_selector("body") else ""
        results.append({
            "path": "/onboarding", "status": "OK", "final_url": page.url,
            "redirected": "/login" in page.url,
            "screenshot": "auth-02-onboarding.png",
            "snippet": body_text[:200]
        })

        # Flow 3: Dashboard pages
        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:]
                body_text = page.inner_text("body")[:500] if page.query_selector("body") else ""
                results.append({
                    "path": path, "screenshot": ss_name, "status": "OK",
                    "final_url": page.url,
                    "redirected": "/login" in page.url,
                    "console_errors": len(new_errors),
                    "error_details": [e["text"][:200] for e in new_errors],
                    "snippet": body_text[:200]
                })
            except Exception as e:
                results.append({"path": path, "screenshot": ss_name, "status": "FAIL", "error": str(e)[:300]})

        # Flow 4: CRM pages
        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:]
                body_text = page.inner_text("body")[:500] if page.query_selector("body") else ""
                results.append({
                    "path": path, "screenshot": ss_name, "status": "OK",
                    "final_url": page.url,
                    "redirected": "/login" in 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: Premium/locked features
        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)
                body_html = page.content()
                body_text = page.inner_text("body")[:500] if page.query_selector("body") else ""
                has_lock = "Lock" in body_html or "locked" in body_html.lower() or "잠금" in body_html
                has_upgrade = "업그레이드" in body_html or "프리미엄" in body_html or "플랜" in body_html or "Premium" in body_html
                has_blur = "blur" in body_html
                results.append({
                    "path": pp, "check": "premium_lock", "screenshot": ss_name,
                    "status": "OK", "final_url": page.url,
                    "redirected": "/login" in page.url,
                    "has_lock_indicator": has_lock,
                    "has_upgrade_cta": has_upgrade,
                    "has_blur_effect": has_blur,
                    "snippet": body_text[:300]
                })
            except Exception as e:
                results.append({"path": pp, "check": "premium_lock", "status": "FAIL", "error": str(e)[:300]})

        # Flow: Check sidebar/navigation
        page.goto(BASE_URL + "/intro", wait_until="networkidle", timeout=15000)
        page.wait_for_timeout(2000)
        sidebar = page.query_selector("aside, [data-sidebar], nav.sidebar")
        all_navs = page.query_selector_all("nav")
        nav_classes = [(nav.get_attribute("class") or "")[:100] for nav in all_navs]
        results.append({
            "check": "desktop_navigation",
            "has_sidebar": sidebar is not None,
            "nav_count": len(all_navs),
            "nav_classes": nav_classes
        })

    else:
        print(f"[AUTH] Not authenticated. Redirected to /login.")
        # Analyze login page structure with email form click
        page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
        page.wait_for_timeout(1500)
        page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-00-login-page.png"), full_page=True)

        # Click 이메일로 계속
        email_btn = page.query_selector('button:has-text("이메일로 계속")')
        if email_btn:
            email_btn.click()
            page.wait_for_timeout(800)
            page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-00-email-form-revealed.png"), full_page=True)

        body_html = page.content()
        has_email = bool(page.query_selector('input[type="email"]'))
        has_pwd = bool(page.query_selector('input[type="password"]'))

        results.append({
            "path": "/login",
            "check": "login_page_analysis",
            "status": "UNAUTHENTICATED",
            "has_email_input_after_click": has_email,
            "has_password_input_after_click": has_pwd,
            "has_google_oauth": "google" in body_html.lower(),
            "screenshot": "auth-00-email-form-revealed.png"
        })

        # Verify all protected routes redirect to /login
        protected_routes = [
            "/intro", "/onboarding", "/generate",
            "/crm/dashboard", "/crm/customers", "/crm/pipeline", "/crm/messenger",
            "/ai-automation", "/ai-onestop", "/info-keyword",
            "/insuwiki-intro", "/settings", "/contents"
        ]
        redirect_results = []
        for route in protected_routes:
            try:
                page.goto(BASE_URL + route, wait_until="networkidle", timeout=10000)
                page.wait_for_timeout(800)
                final_url = page.url
                redirected = "/login" in final_url
                redirect_results.append({
                    "route": route,
                    "redirected_to_login": redirected,
                    "status": "PASS" if redirected else "FAIL"
                })
            except Exception as e:
                redirect_results.append({"route": route, "status": "ERROR", "error": str(e)[:100]})

        results.append({
            "check": "protected_route_redirects",
            "all_pass": all(r.get("redirected_to_login", False) for r in redirect_results),
            "details": redirect_results
        })

    context.close()

    # ===== MOBILE CONTEXT =====
    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)

    # Inject session on mobile if REST succeeded
    if login_success and session_data and "REST" in (auth_method or ""):
        mobile_page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
        page.wait_for_timeout(500)
        storage_key = "sb-zayhfjuwviporbzokudr-auth-token"
        token_payload = {
            "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({json.dumps(token_payload)}));
            }}
        """)

    try:
        # Mobile login page
        mobile_page.goto(BASE_URL + "/login", wait_until="networkidle", timeout=15000)
        mobile_page.wait_for_timeout(1500)
        mobile_page.screenshot(path=os.path.join(SCREENSHOT_DIR, "auth-06-mobile-login.png"), full_page=False)

        login_body = mobile_page.inner_text("body")[:300] if mobile_page.query_selector("body") else ""
        has_mobile_only_logo = "InsuRo" in login_body
        results.append({
            "path": "/login (mobile 375px)",
            "check": "mobile_login_page",
            "status": "OK",
            "screenshot": "auth-06-mobile-login.png",
            "has_mobile_logo": has_mobile_only_logo,
            "snippet": login_body[:200]
        })

        # Navigate to /intro on mobile
        mobile_page.goto(BASE_URL + "/intro", wait_until="networkidle", timeout=15000)
        mobile_page.wait_for_timeout(3000)
        final_url = mobile_page.url
        auth_on_mobile = "/login" not in final_url

        # Check for mobile bottom nav
        all_navs = mobile_page.query_selector_all("nav")
        nav_info = []
        for nav in all_navs:
            cls = nav.get_attribute("class") or ""
            nav_info.append(cls[:120])

        # Check for "fixed bottom" patterns in page HTML
        page_html = mobile_page.content()
        has_fixed_bottom = "fixed bottom" in page_html or "bottom-0" in page_html
        has_mobile_nav_class = "md:hidden" in page_html

        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",
            "status": "OK",
            "final_url": final_url,
            "redirected_to_login": not auth_on_mobile,
            "nav_count": len(all_navs),
            "nav_classes": nav_info,
            "has_fixed_bottom_in_html": has_fixed_bottom,
            "has_md_hidden_class": has_mobile_nav_class,
        })

        if auth_on_mobile:
            # Mobile /generate
            mobile_page.goto(BASE_URL + "/generate", wait_until="networkidle", timeout=15000)
            mobile_page.wait_for_timeout(2000)
            all_navs2 = mobile_page.query_selector_all("nav")
            nav_info2 = [(nav.get_attribute("class") or "")[:120] for nav in all_navs2]
            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",
                "status": "OK",
                "final_url": mobile_page.url,
                "nav_count": len(all_navs2),
                "nav_classes": nav_info2
            })

    except Exception as e:
        results.append({"path": "mobile", "status": "FAIL", "error": str(e)[:300]})

    mobile_context.close()
    browser.close()

# Save results
output = {
    "login_success": login_success,
    "auth_method": auth_method,
    "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))
