import uuid

import pytest

pytestmark = pytest.mark.asyncio


async def test_session_id(new_session, add_browser_capabilities):
    bidi_session = await new_session(
        capabilities={"alwaysMatch": add_browser_capabilities({})}
    )
    assert isinstance(bidi_session.session_id, str)
    uuid.UUID(hex=bidi_session.session_id)


async def test_capability_type(new_session, add_browser_capabilities):
    bidi_session = await new_session(
        capabilities={"alwaysMatch": add_browser_capabilities({})}
    )

    default_capability_types = [
        ("acceptInsecureCerts", bool),
        ("browserName", str),
        ("browserVersion", str),
        ("platformName", str),
        ("setWindowRect", bool),
        ("userAgent", str),
    ]

    assert isinstance(bidi_session.capabilities, dict)

    for capability, type in default_capability_types:
        assert isinstance(bidi_session.capabilities[capability], type)


async def test_capability_default_value(new_session, add_browser_capabilities):
    bidi_session = await new_session(
        capabilities={"alwaysMatch": add_browser_capabilities({})}
    )
    assert isinstance(bidi_session.capabilities, dict)

    assert bidi_session.capabilities["acceptInsecureCerts"] is False
    assert "proxy" not in bidi_session.capabilities


async def test_proxy_capability_returned_when_set(
    new_session, add_browser_capabilities
):
    bidi_session = await new_session(
        capabilities={
            "alwaysMatch": add_browser_capabilities({"proxy": {"proxyType": "direct"}})
        }
    )
    assert isinstance(bidi_session.capabilities["proxy"], dict)
    assert bidi_session.capabilities["proxy"]["proxyType"] == "direct"


async def test_ignore_non_spec_fields_in_capabilities(
    new_session, add_browser_capabilities
):
    bidi_session = await new_session(
        capabilities={
            "alwaysMatch": add_browser_capabilities({}),
            "nonSpecCapabilities": {"acceptInsecureCerts": True},
        }
    )

    assert bidi_session.capabilities["acceptInsecureCerts"] is False


@pytest.mark.parametrize("match_type", ["alwaysMatch", "firstMatch"])
@pytest.mark.parametrize(
    "key, value",
    [
        ("pageLoadStrategy", "none"),
        ("strictFileInteractability", True),
        ("timeouts", {"script": 500}),
    ],
)
async def test_with_webdriver_classic_capabilities(
    new_session, match_capabilities, match_type, key, value
):
    capabilities = match_capabilities(match_type, key, value)

    bidi_session = await new_session(capabilities=capabilities)

    assert isinstance(bidi_session.capabilities, dict)
    assert key not in bidi_session.capabilities
