import os
import base64
import time
from playwright.sync_api import sync_playwright

HTML_URL = "file:///c:/code2026/house/dollhouse_visualizer.html"
OUT_DIR = r"c:\code2026\house\images"

def save_data_url(data_url, filepath):
    header, encoded = data_url.split(",", 1)
    data = base64.b64decode(encoded)
    with open(filepath, "wb") as f:
        f.write(data)
    print(f"Saved: {filepath} ({len(data)} bytes)", flush=True)

def main():
    print("Launching Chromium...", flush=True)
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            args=[
                "--enable-webgl",
                "--use-gl=angle",
                "--use-angle=swiftshader"
            ]
        )
        page = browser.new_page(viewport={"width": 1600, "height": 900})
        print(f"Navigating to {HTML_URL}...", flush=True)
        page.goto(HTML_URL, wait_until="domcontentloaded")
        
        # Wait until renderer and controls are defined
        print("Waiting for 3D engine to initialize...", flush=True)
        page.wait_for_function("() => typeof renderer !== 'undefined' && renderer !== null && typeof controls !== 'undefined' && controls !== null", timeout=15000)
        time.sleep(2)
        print("3D Scene initialized successfully!", flush=True)

        # View 1: Rear Open Interior (Default Perspective looking into rooms)
        print("Rendering View 1: Rear Open Interior...", flush=True)
        data1 = page.evaluate("""() => {
            controls.target.set(0, 11.5, 0);
            camera.position.set(0, 14, 46);
            controls.update();
            renderer.setSize(1600, 900, false);
            camera.aspect = 1600 / 900;
            camera.updateProjectionMatrix();
            renderer.render(scene, camera);
            return renderer.domElement.toDataURL('image/png');
        }""")
        out1 = os.path.join(OUT_DIR, "visualizer_3d_rear_open.png")
        save_data_url(data1, out1)

        # View 2: Front 3D Perspective (Looking at Front Facade, Roof & Bay Window)
        print("Rendering View 2: Front 3D Exterior Perspective...", flush=True)
        data2 = page.evaluate("""() => {
            controls.target.set(0, 11.5, 0);
            camera.position.set(-22, 18, -42); // 3D front 3/4 angle
            controls.update();
            renderer.render(scene, camera);
            return renderer.domElement.toDataURL('image/png');
        }""")
        out2 = os.path.join(OUT_DIR, "visualizer_3d_front_exterior.png")
        save_data_url(data2, out2)

        # View 3: Landscaped Grounds & Elevated House Plinth
        print("Rendering View 3: 3D Landscape Grounds & Plinth...", flush=True)
        data3 = page.evaluate("""() => {
            controls.target.set(0, 9.0, -2.0);
            camera.position.set(24, 32, 46); // 3D elevated grounds perspective
            controls.update();
            renderer.render(scene, camera);
            return renderer.domElement.toDataURL('image/png');
        }""")
        out3 = os.path.join(OUT_DIR, "visualizer_3d_landscape_angle.png")
        save_data_url(data3, out3)

        browser.close()
        print("SUCCESS! All 3D visualizer renders saved!", flush=True)

if __name__ == "__main__":
    main()
