import os
import sys
import json
import asyncio
from playwright.async_api import async_playwright

if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8")
if hasattr(sys.stderr, "reconfigure"):
    sys.stderr.reconfigure(encoding="utf-8")

async def test_pixel_and_shader_buffer():
    html_path = os.path.abspath('app/static/bim/index.html').replace('\\', '/')
    file_url = f'file:///{html_path}'
    print(f'=== TESTING WEBGL FRAMEBUFFER SPRITE PIXEL RENDER ===')

    async with async_playwright() as p:
        browser = await p.chromium.launch(channel="chrome", headless=True)
        page = await browser.new_page(viewport={"width": 1920, "height": 1080})
        
        await page.goto(file_url, wait_until='load')
        await page.wait_for_timeout(1000)

        # Switch to cross-section preset to have dimension sprites prominent in view
        await page.evaluate('''() => {
            setPresetView('cross_section');
            renderer.render(scene, camera);
        }''')
        await page.wait_for_timeout(500)

        pixel_result = await page.evaluate('''() => {
            const canvas = document.querySelector('canvas');
            const gl = canvas.getContext('webgl') || canvas.getContext('webgl2');
            
            // Check texture binding and sprite materials
            const sprites = window.groupDimensions.children.filter(c => c.isSprite);
            let validTextures = 0;
            sprites.forEach(s => {
                if (s.material && s.material.map && s.material.map.image) {
                    if (s.material.map.image.width > 0 && s.material.map.image.height > 0) {
                        validTextures++;
                    }
                }
            });

            // Capture data URL directly from canvas
            const dataUrl = canvas.toDataURL('image/png');

            return {
                totalSprites: sprites.length,
                validTextures: validTextures,
                canvasWidth: canvas.width,
                canvasHeight: canvas.height,
                dataUrlLength: dataUrl.length,
                isDataUrlNonEmpty: dataUrl.length > 5000
            };
        }''')

        await browser.close()
        print('Pixel and Texture Verification Result:', json.dumps(pixel_result, indent=2))
        assert pixel_result['totalSprites'] == 21
        assert pixel_result['validTextures'] == 21
        assert pixel_result['isDataUrlNonEmpty'] is True
        print("All 21 sprites have valid non-zero offscreen canvas textures rasterized into GPU memory!")
        return pixel_result

if __name__ == '__main__':
    asyncio.run(test_pixel_and_shader_buffer())
