import asyncio
import sys
from pathlib import Path

import pymupdf as fitz
from playwright.async_api import async_playwright

if sys.stdout and hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8")


def create_sample_drawing_pdf(filepath: Path):
    doc = fitz.open()
    page = doc.new_page(width=842, height=595)
    page.draw_rect(fitz.Rect(20, 20, 822, 575), color=(0, 0.4, 0.8), width=2)
    page.insert_text(
        fitz.Point(40, 60),
        "CÔNG TY TNHH XÂY DỰNG ĐỊNH SƠN - DSCons",
        fontsize=14,
        color=(0, 0.2, 0.6),
    )
    page.insert_text(
        fitz.Point(40, 90),
        "BẢN VẼ: CỐNG HỘP BẾN KEM - KÈ ĐA ĐỘ K2+150",
        fontsize=16,
        color=(0, 0, 0),
    )
    page.insert_text(
        fitz.Point(40, 120),
        "Thông số: Dài L=25.0m, Rộng B=6.5m, Chiều sâu hố móng H=2.2m",
        fontsize=11,
    )
    page.insert_text(
        fitz.Point(40, 140),
        "Bê tông lót đáy: Mác 100 đá 4x6 dày 10cm | Bê tông thân cống: Mác 300 đá 1x2",
        fontsize=11,
    )
    page.insert_text(
        fitz.Point(40, 160),
        "Cốt thép chịu lực: CB300-V D<=18mm | Ván khuôn thép định hình",
        fontsize=11,
    )
    page.insert_text(
        fitz.Point(40, 180),
        "Tỷ lệ: 1:100 | Bóc tách khối lượng tự động AI Quỳnh QS 2026",
        fontsize=10,
        color=(0.3, 0.3, 0.3),
    )
    doc.save(str(filepath))
    doc.close()


async def run_browser_verification():
    sample_pdf = Path("storage/secure_vault/SAMPLE_E2E_CONG_BEN_KEM.pdf")
    sample_pdf.parent.mkdir(parents=True, exist_ok=True)
    create_sample_drawing_pdf(sample_pdf)

    screenshot_path = Path(
        "C:/Users/Admin/.gemini/antigravity/brain/f8ad1da2-f0d8-48ab-adb7-9d996613f039/drawing_takeoff_ui_verified.png"
    )

    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        context = await browser.new_context(viewport={"width": 1440, "height": 900})

        # Pre-authenticate via cookie and localStorage init script
        await context.add_cookies(
            [
                {
                    "name": "dscons_jwt_token",
                    "value": "dev-test-token",
                    "domain": "127.0.0.1",
                    "path": "/",
                }
            ]
        )

        page = await context.new_page()
        await page.add_init_script(
            "localStorage.setItem('dscons_jwt_token', 'dev-test-token');"
        )

        print("[E2E] Navigating to Drawing Takeoff Dashboard...")
        await page.goto(
            "http://127.0.0.1:8000/dashboard/drawing-takeoff", wait_until="networkidle"
        )

        title = await page.title()
        print(f"[E2E] Page Title: {title}")

        # Open Upload Modal
        print("[E2E] Opening Upload Modal...")
        await page.click("button:has-text('Tải Lên Bản Vẽ CAD / PDF')")
        await page.wait_for_selector("#uploadModal.active", timeout=5000)

        # Set file input
        file_input = await page.query_selector("#fileInput")
        await file_input.set_input_files(str(sample_pdf))

        # Fill hint
        await page.fill(
            "#uploadDrawingHint", "Bản vẽ cống hộp Bến Kem Hải Phòng K2+150"
        )

        # Submit upload
        print("[E2E] Submitting fast decoupled upload...")
        await page.click("#btnSubmitUpload")

        # Verify modal closes quickly (< 2 seconds)
        await page.wait_for_selector("#uploadModal", state="hidden", timeout=3000)
        print(
            "[E2E] Upload modal closed immediately (< 1s)! Non-blocking upload succeeded."
        )

        # Wait for background AI bóc tách poller to finish or for active items
        print("[E2E] Waiting for AI background extraction to complete...")
        await page.wait_for_timeout(6000)

        # Check table body rows
        rows = await page.query_selector_all("#takeoffTableBody tr")
        print(f"[E2E] Takeoff BoQ Table rendered with {len(rows)} rows.")

        # Take high-res screenshot
        await page.screenshot(path=str(screenshot_path), full_page=True)
        print(f"[E2E] Screenshot saved to: {screenshot_path}")

        await browser.close()


if __name__ == "__main__":
    asyncio.run(run_browser_verification())
