import os
import sys
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_bim_dimensions():
    html_path = os.path.abspath('app/static/bim/index.html').replace('\\', '/')
    file_url = f'file:///{html_path}'
    print(f'Navigating to: {file_url}')
    async with async_playwright() as p:
        browser = await p.chromium.launch(channel="chrome", headless=True)
        page = await browser.new_page()
        console_errors = []
        page.on('console', lambda msg: console_errors.append(msg.text) if msg.type == 'error' else None)
        page.on('pageerror', lambda exc: console_errors.append(str(exc)))

        await page.goto(file_url, wait_until='load')
        await page.wait_for_timeout(1000)

        print(f'Console errors count: {len(console_errors)}')
        if console_errors:
            print('Errors:', console_errors)

        result = await page.evaluate('''() => {
            return {
                groupDimensionsExists: typeof groupDimensions !== 'undefined',
                childrenCount: typeof groupDimensions !== 'undefined' ? groupDimensions.children.length : 0,
                isDimensionsVisible: typeof isDimensionsVisible !== 'undefined' ? isDimensionsVisible : null,
                chkDimensionsChecked: document.getElementById('chkDimensions') ? document.getElementById('chkDimensions').checked : null,
                btnDimsExists: !!document.getElementById('btnDims')
            };
        }''')
        print('Evaluation result:', result)

        # Count sprites and line segments
        counts = await page.evaluate('''() => {
            let sprites = 0, lines = 0, labels = [];
            window.groupDimensions.children.forEach(c => {
                if (c.isSprite) {
                    sprites++;
                    if (c.userData && c.userData.label) labels.push(c.userData.label);
                }
                if (c.isLineSegments || c.isLine) lines++;
            });
            return { sprites, lines, total: window.groupDimensions.children.length, labels };
        }''')
        print('Dimensions children breakdown:', counts)
        print(f'Total labels collected ({len(counts["labels"])}):', counts['labels'])

        # Test toggling off
        await page.evaluate('toggleDimensions()')
        toggled = await page.evaluate('''() => {
            return {
                visible: groupDimensions.visible,
                chk: document.getElementById('chkDimensions').checked,
                btnClass: document.getElementById('btnDims').className
            };
        }''')
        print('After toggleDimensions (off):', toggled)

        # Test toggling on
        await page.evaluate('toggleDimensions()')
        toggled_on = await page.evaluate('''() => {
            return {
                visible: groupDimensions.visible,
                chk: document.getElementById('chkDimensions').checked,
                btnClass: document.getElementById('btnDims').className
            };
        }''')
        print('After toggleDimensions (on):', toggled_on)

        # Test toggleLayer('dimensions', false)
        await page.evaluate('toggleLayer("dimensions", false)')
        layer_off = await page.evaluate('''() => {
            return {
                visible: groupDimensions.visible,
                chk: document.getElementById('chkDimensions').checked,
                btnClass: document.getElementById('btnDims').className
            };
        }''')
        print('After toggleLayer dimensions false:', layer_off)

        # Test toggleLayer('dimensions', true)
        await page.evaluate('toggleLayer("dimensions", true)')
        layer_on = await page.evaluate('''() => {
            return {
                visible: groupDimensions.visible,
                chk: document.getElementById('chkDimensions').checked,
                btnClass: document.getElementById('btnDims').className
            };
        }''')
        print('After toggleLayer dimensions true:', layer_on)

        await browser.close()
        assert len(console_errors) == 0, f'Console errors detected: {console_errors}'
        assert result['groupDimensionsExists'] is True
        assert result['childrenCount'] > 0
        assert counts['sprites'] >= 20
        assert counts['lines'] >= 18
        print('ALL CHECKS PASSED!')

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