"""階段 4d + 4e 測試:語意搜尋 + 今日簡報。"""

import asyncio
import sys
import time
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"
OUT_DIR.mkdir(exist_ok=True)

ROBERT = {"email": "ssbb30529@gmail.com", "password": "a183b729"}


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,
            args=["--disable-blink-features=AutomationControlled"],
            viewport={"width": 1280, "height": 900},
        )
        results = {"passes": [], "fails": []}

        try:
            page = await ctx.new_page()
            page.set_default_timeout(15000)
            await page.goto("http://localhost:8000", wait_until="domcontentloaded")
            await page.evaluate("localStorage.clear()")
            await page.reload(wait_until="domcontentloaded")
            await page.wait_for_selector("#login-view", state="visible")
            await page.fill("#email", ROBERT["email"])
            await page.fill("#password", ROBERT["password"])
            await page.click("#login-btn")
            await page.wait_for_selector("#dashboard-view", state="visible")
            await page.click('button.section-tab[data-section="chat"]')
            await asyncio.sleep(0.7)

            # ── TEST 1:搜尋按鈕 + modal ──
            await page.click("#open-search-btn")
            await page.wait_for_selector("#search-modal.show", state="visible")
            results["passes"].append("TEST 1: 搜尋 modal 開啟 ✓")

            # ── TEST 2:輸入 query 應該回相關訊息 ──
            await page.fill("#search-input", "Q4 預算")
            await page.press("#search-input", "Enter")
            try:
                await page.wait_for_selector(".search-result-item", timeout=10000)
                count = await page.locator(".search-result-item").count()
                results["passes"].append(f"TEST 2: 搜尋「Q4 預算」回 {count} 筆相關訊息 ✓")
            except Exception as e:
                results["fails"].append(f"TEST 2: 搜尋沒結果 ({e})")

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

            # 關閉搜尋
            await page.keyboard.press("Escape")
            await asyncio.sleep(0.3)

            # ── TEST 3:今日簡報按鈕 + modal ──
            await page.click("#open-brief-btn")
            await page.wait_for_selector("#brief-modal.show", state="visible")
            results["passes"].append("TEST 3: 簡報 modal 開啟 ✓")

            # ── TEST 4:Claude 產出簡報內容 ──
            try:
                t0 = time.time()
                await page.wait_for_function(
                    """() => {
                        const t = document.getElementById('brief-body').textContent;
                        return t && !t.includes('整理中') && t.length > 50;
                    }""",
                    timeout=30000,
                )
                elapsed = (time.time() - t0) * 1000
                brief_text = await page.locator("#brief-body").inner_text()
                results["passes"].append(f"TEST 4: 簡報在 {elapsed/1000:.1f} 秒內產出({len(brief_text)} 字)")
                # 應該包含使用者名稱(Robert)
                if "Robert" in brief_text:
                    results["passes"].append("TEST 5: 簡報有提到使用者名字 ✓")
                else:
                    results["fails"].append(f"TEST 5: 簡報沒提到 Robert:{brief_text[:100]!r}")
                print(f"\n>>> 簡報內容:\n{brief_text}\n")
            except Exception as e:
                results["fails"].append(f"TEST 4: 簡報沒產出 ({e})")

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

        finally:
            await ctx.close()

        print("\n" + "=" * 60)
        print(" 階段 4d + 4e 測試結果")
        print("=" * 60)
        for p in results["passes"]:
            print(f"[PASS] {p}")
        for f in results["fails"]:
            print(f"[FAIL] {f}")
        print("=" * 60)
        return 0 if not results["fails"] else 1


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